24.4 创建和使用 Promise

让我们看一下生产端和消费端是如何操作 Promise 的。

24.4.1 生成 Promise

作为一个生产者,需要创建一个 Promise ,然后通过它发送最终结果:

let promise = new Promise(
    function (resolve, reject) { // (A)
        ···
        if (···) {
            resolve(value); // success
        } else {
            reject(reason); // failure
        }
    });

一个 Promise 总是处于三种状态(互相排斥)中的一种:

  • 等待( pending ):结果还没计算出来
  • 成功完成( fullfilled ):结果成功地被计算出来了
  • 被驳回( rejected ):在计算的过程中失败了

如果一个 Promise 已经成功完成或者被驳回了,那么它就会保持这个状态不再变化了。一个 Promise 只能有一次机会变稳定,然后就一直保持稳定了。接下来试图使它变稳定的操作都不会有效果。

new Promise() (开始于行 A )的参数被称为执行者( executor ):

  • 如果计算过程顺利执行,执行者通过 resolve() 发送执行结果。这通常会将 Promise 置为成功完成的状态(如果返回一个 Promise ,可能就不会这样,就像后面讲解的)。
  • 如果出错了,执行者通过 reject() 通知 Promise 。这总是会将 Promise 置为被驳回状态。

24.4.2 消费 Promise

作为一个 Promise 的消费者,会在通过 then() 注册的回调中接收到成功完成或者被驳回的通知:

promise.then(
    function (value) { /* fulfillment */ },
    function (reason) { /* rejection */ }
);

对于异步函数(最终结果是一次性的),让 Promise 如此有用的原因是,一旦 Promise 稳定了,就不会变化了。而且,没有任何竞态条件,因为在 Promise 稳定之前或之后调用 then() 方法是无关紧要的:

  • 在 Promise 稳定之前注册的回调,一旦 Promise 变为稳定状态,就会收到通知。
  • 在 Promise 稳定之后注册的回调,会“立即”接收到缓存下来的稳定状态值(回调函数像任务队列一样被调用)。

24.4.3 仅处理成功完成或被驳回

如果仅对成功完成感兴趣,可以忽略 then() 的第二个参数:

promise.then(
    function (value) { /* fulfillment */ }
);

如果仅对被驳回感兴趣,可以省略第一个参数。 catch() 方法是一种完成相同功能的更紧凑方式。

promise.then(
    null,
    function (reason) { /* rejection */ }
);

// Equivalent:
promise.catch(
    function (reason) { /* rejection */ }
);

推荐用 then() 处理成功完成, catch() 处理错误,因为这样就给回调打上了贴切的标签,也因为可以同时处理多个 Promise 的驳回(后面详细讲解)。

results matching ""

    No results matching ""