Promise对象入门

简介

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

catch

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

finally

无论Promise对象最后结果如何,都会执行的操做,finally方法中的回调函数不接受任何参数code

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

all

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

相关文章
相关标签/搜索