ES6 Promise

61 阅读2分钟

promise

一、理解

  1. 抽象的表达: promise是js中进行异步编程的新的解决方案(旧的是谁)?旧的是纯回调函数
  2. 具体表达:
    (1)从语法上来说:promise是一个构造函数
    (2)从功能上来说:promise对象用来封装

二、概述

  • promise是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
  • Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。
  • Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。
  • Promise是一个构造函数,其原型上有then、catch方法,对象上有reject、resolve方法。

三、Promise 异步操作三种状态过程图

image.png

四、Promise的语法

new Promise( function(resolve, reject) {...} /* executor */  );

下面我们来解释一下resolve和reject是什么

<script>
        const flag = true //承诺true/false
        const proObj = new Promise(function (resolve, reject) {
            if (flag) {
                resolve("成功")
            } else {
                reject("失败")
            }
        });
        proObj.then(function (result) {
            console.log(result); //成功
        }).catch(function (err) {
            console.log(err); //失败
        })
    </script>

这里的resolve,和reject参数是函数,当承诺实现了的时候,就会调用resolve函数,然后对应的promise的状态就变成fulfilled;当承诺没有实现的时候,就会调用reject函数,其状态变成了rejected。是否还记得创建promise的语法:

new Promise( function(resolve, reject) {...} /* executor */  );

这里的executor是一个函数。就是new Promise括号括着的函数叫做executor,resolve和reject函数是作为executor的参数被传进去的,当然这两个参数是可选填的。resolve或reject函数如果被调用了就会把函数里的结果作为参数传递出去; resolve是把函数里的结果传递出去,而reject就说明是承诺没实现,这相当于是出错误了,所以它会把报错的信息作为参数传递出去。

.then()有两个参数: onFulfilled和onRejected,这两个参数看英文也知道是什么意思,这两个参数也是函数,onFulfilled当然是Promise'实现的时候调用,onRejected就是Promise被拒绝的时候调用的。我们来看看MDN怎么说:

onFulfilled

当Promise变成接受状态(fulfillment)时,该参数作为回调函数被调用(参考: Function)。该函数有一个参数,即接受的最终结果(the fulfillment  value)。如果传入的 onFulfilled 参数类型不是函数,则会在内部被替换为(x) => x ,即原样返回 promise 最终结果的函数

onRejected

当Promise变成拒绝状态(rejection )时,该参数作为回调函数被调用(参考: Function)。该函数有一个参数,,即拒绝的原因(the rejection reason)。

.then()有两种写法任君选择

p.then(onFulfilled, onRejected);
 
p.then(function(value) {
   // fulfillment
  }, function(reason) {
  // rejection
});

而.catch()是当promise没有实现的时候,状态为rejected时被使用。