【ES6】Promise

含义

Promise是异步编程的一种解决方案。简单来说是一个容器,里面保存着某个未来才会结束的事件的结果(通常是一个异步操作)。
  • 特点:
    1. 状态不受外界影响。三种状态:pending(进行中),fulfilled(已成功)和rejected(已失败)。只有异步操作的结果可以决定当前的状态,其他任何其他操作都无法改变这个状态。
    2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。pending进行中->fulfilled已成功。pending进行中->rejected已失败。resolved(已定型)表示fulfilled已成功
  • 缺点:
    1. 无法取消,一旦新建就立即执行,无法中途取消
    2. 处于pending状态时,无法得知目前进展到哪一阶段
    3. 如果不设置回调函数,Promise内部抛出的错误不会反应到外部

基本用法

     const promise=new Promise((resolve,reject)=>{
       if(/* 异步操作成功 */){
         resolve(value);
       }else{
         reject(error)
       }
     })
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
     promise.then(value=>{
       成功
     },error=>{
       失败
     })

Promise.prototype.then()

作用是为promise实例添加状态改变时的回调函数。

then方法返回的是一个新的promise实例,因此可以采用链式写法。

    fn(2000)
      .then(res => {
        console.log(res);
        return '我是下一个then的res,基本return另一个promise'
      }).then(res=>{
      })

Promise.prototype.catch()

.then(null, rejection)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });

Promise对象的错误有冒泡性,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。

Promise 内部的错误不会影响到 Promise 外部的代码,通俗的说法就是“Promise 会吃掉错误”。

Promise.prototype.finally()

finally方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。其回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。表明finally方法里面的操作应该是与状态无关的,不依赖于 Promise 的执行结果。
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});

Promise.all()

将多个promise实例包装成一个新实例。
const p = Promise.all([p1, p2, p3]);

若p1,p2,p2都fulfilled,p的状态才会变成fulfilled,此时他们的返回值组成一个数组传递给p的then回调函数

若只要其中一个被rejected,p的状态会变成rejuected,率先被rejected的结果传递给p的catch回调

Promise.race([p1,p2,p3])

哪个率先完成,其结果传递

Promise.allSettled([p1,p2,p3])

等到p1,p2,p3都结束,该方法会返回新promise实例,状态总是fulfilled,不会变成rejected。返回结果如下:

[
    { status: 'fulfilled', value: 42 },
    { status: 'rejected', reason: -1 }
 ]

 

使用场景,一进页面三个请求,不管失败还是成功,加载滚动图标消失

Promise.any([p1,p2,p3])

只要一个fulfilled,包装实例就变成fulfilled。都rejected,包装实例都变成rejected。

Promise.resolve()

将现有对象转换为promise实例

Promise.resolve('foo')
//等同于
new Promise(res=>resolve('foo'))

 

Promise.reject()

Promise.reject(reason)返回一个新的Promise实例,该实例的状态为rejected

Promise.try()

看资料:https://es6.ruanyifeng.com/#docs/promise

posted @ 2019-12-28 23:18  把我当做一棵树叭  阅读(133)  评论(0)    收藏  举报