promise对象能够获取异步操做的消息,提供统一的API,各个异步操做均可以用一样的方法进行处理。
promise对象不受外界影响,其有三种状态:pending(进行中)、fulfilled(成功)、rejected(失败),只有异步操做的结果能够决定当前状态,一旦状态改变就不能够再变化,状态改变方向有两种:pending -> fulfilled、pending -> rejected
promise对象的意义就在于将异步操做以同步操做的流程表达,避免层层嵌套的回调函数javascript
let promise = new Promise(function (resolve, reject) { if () { resolve(value) // 异步操做成功 } else { reject(error) // 失败抛错 } })
Promise构造函数接受一个函数做为参数,该函数有两个参数:resolve、reject,当执行resolve函数时Promise对象状态pending -> fulfilled,当执行reject时Promise对象状态pending -> rejectedjava
promise.then(function (value) { }, function (error) { })
Promise实例生成之后,能够用then方法分别指定resolved状态和rejected状态的回调函数,第二个参数为可选参数,例子:数组
let promise = new Promise(function (resolve, reject) { console.log('promise') resolve('11') }) promise.then(function (value) { console.log(value) }) console.log('22')
执行结果'promise -> 22 -> 11',promise对象新建后当即执行,then方法的回调会在全部同步任务执行完成后执行promise
promise.prototype.catch()是then()方法的别名,用于指定发生错误时的回调函数异步
new Promise(function () { }).then(() => { }).catch(err => { console.log(err) })
若是异步操做抛出错误,状态就会变为reject,就会调用catch中的回调,当状态为resolve,执行then方法中的回调时,若报错一样回进入catch的回调
意义:当咱们使用promise异步操做时,可是没有使用catch捕获错误时,若promise异步执行报错时,外部代码并不会接收到错误,而是继续执行不受影响函数
const someAsyncThing = function() { return new Promise(function(resolve, reject) { resolve(x); }); }; someAsyncThing().then(function() { console.log('ok'); }); setTimeout(() => { console.log('continue') }, 100);
如代码所示,x变量并无定义,期待的操做是执行报错,而后中止运行,实际上‘continue’会执行输出,这说明当没有catch捕获错误时,外部代码不会知道Promise对象内部执行已经报错,所以会继续执行。prototype
无论Promise对象最后结果如何,都会执行的操做,finally方法中的回调函数不接受任何参数code
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});
Promise.all方法用于将多个Promise实例包装成一个新的实例对象
Promise.all([p1,p2,p3]).then((array) => { }).catch((err) => { })
只有p一、p二、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p一、p二、p3的返回值组成一个数组,传递给p的回调函数。
只要p一、p二、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。ip