【ES6】Promise
含义
Promise是异步编程的一种解决方案。简单来说是一个容器,里面保存着某个未来才会结束的事件的结果(通常是一个异步操作)。
- 特点:- 状态不受外界影响。三种状态:pending(进行中),fulfilled(已成功)和rejected(已失败)。只有异步操作的结果可以决定当前的状态,其他任何其他操作都无法改变这个状态。
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。pending进行中->fulfilled已成功。pending进行中->rejected已失败。resolved(已定型)表示fulfilled已成功
 
- 缺点:- 无法取消,一旦新建就立即执行,无法中途取消
- 处于pending状态时,无法得知目前进展到哪一阶段
- 如果不设置回调函数,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
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号