promise 笔记

特点
  • 不受外界影响

有三种状态: pending(进行中) fulfiled(已成功) rejected(已失败)。
只有异步的结果可以决定当前转台,其他操作都无法改变状态。

  • 一旦改变状态,就不会再变,任何时候都可以得到这个结果

改变状态只有两种方向:pending->fulfilled; pending->rejected

缺点
  • 一旦创建会立即执行,无法中途取消
  • 如果不设置回调函数,内部会抛出错误,不会反应到外部。
  • 处于pending状态时,无法得知目前进展到哪一个阶段

基本用法

ES6规定promiese是一个构造函数,用来生成Promise实例

  • 下面代码创造了一个Promise实例
const promise = new Promise(function(resolve,reject){
    //some code  (立即执行)
    
    if(/*异步操作成功*/){
        resolve(value)
    } else {
        reject(error)
    }
})

Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。

  • Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
promise.then(function(value){
    //success
},function(error){
    //failure
});

Promise.prototype.then()

采用链式的then,可以指定一次按照次序调用的回调函数,前一个回调函数,有可能返回的还是一个Promise对象(即有异步操作),这时 后一个回调函数,就会等待该Promise对象状态改变,才会被调用。

getJson("/post.json").then(
    post=>getJson(post.commenURL)
).then(
    comments => console.log("resolve:",comments)
    err => console.log("rejected:",err)
)

Promise.prototype.catch()
p.then((val) => console.log('fulfilled:', val))
  .catch((err) => console.log('rejected', err));

// 等同于
p.then((val) => console.log('fulfilled:', val))
  .then(null, (err) => console.log("rejected:", err));

Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。
一般来说,不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。

// bad
promise
  .then(function(data) {
    // success
  }, function(err) {
    // error
  });

// good
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });
  
Promise.prototype.finally()

finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

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

对于不论结果如何都要执行的方法,如果不使用finally方法,同样的语句需要为成功和失败两种情况各写一次。有了finally方法,则只需要写一次。

promise
.finally(() => {
  // 语句
});

// 等同于
promise
.then(
  result => {
    // 语句
    return result;
  },
  error => {
    // 语句
    throw error;
  }
);

Promise.all()

Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

  • 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  • 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise.race()

只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

猜你喜欢

转载自blog.csdn.net/qq_36546825/article/details/85759586
今日推荐