一、Promise
它的产生是为了解决回调地狱的现象,通过链式调用,解决函数嵌套的复杂关系 Promise可以通过new来创建实例对象,要注意,Promise一经实例化立即执行
Promise共有三种状态,等待(pending),成功(fulfilled),失败(rejected),状态一旦发生改变,就不会再次变更
Promise的成功后结果可以通过.then来获取.then接受两个回调参数,第一个是成功后的回调,参数接收成功的结果:
const p = new Promise((resolve,reject)=>{ resolve(1) }) p.then((res)=>{ console.log('我成功了'); // 1 })
第二个是失败后的回调,参数接受失败的结果,第二个参数传,错误结果也可以通过.catch来捕捉:
const p = new Promise((resolve,reject)=>{ reject(1) }) p.then(null,err => { console.log('我失败了'); }) // 等价于 p.then().catch(err=>{ console.log('我失败了'); })
Promise的每次调用都会返回一个Promise实例,这个实例就是上一次调用执行函数的返回结果(成功或失败),如果成功,而then函数的成功回调函数没有传,Promise就会对该结果进行处理,正确的值就会继续向下流转,被后面的then函数接收。
如果失败的话,失败的回调参数没有传,Promise内部也会进行处理,该错误就会继续向下抛,如果最终没有接受的话,就会在控制台抛出错误信息
Promise还有一个finally方法,表示最终都会执行该函数,如果我们想要不论成功还是失败都要必须要执行的代码,就可以写在finally中,这样就避免了then与catch里面的冗余代码,
二、async与await
async与await 是es6的新语法,它可以把异步函数处理成同步函数,也可以用来调整代码执行顺序,
await在修饰Promise实例的方法时会接受该实例返回的成功结果。如果失败,则会抛出错误,所以在平时使用中,我们需要配合try{}catch(){}搭配使用,捕捉错误,避免不需要的麻烦
注意 :
- await必须使用在async修饰过的函数中
- async修饰过的函数,会返回一个Promise实例,即使函数体里面什么也没写。
- await会等待被它修饰过的代码执行后,才会接着执行下面的代码,如果await后面的代码耗时较长,就会造成阻塞