Promise 介绍

一个 Promise 对象表示的操作已产生或将最终产生的值。Promises 提供了一种强大的方法来包装异步工作的(可能是待定的)结果,减轻了深层嵌套回调的问题(称为“ 回调地狱 ”)。

国家和控制流程

承诺可以是以下三种状态之一:

  • 待定 - 基础操作尚未完成,承诺尚未完成。
  • 完成 -该操作已完成,并承诺被兑现价值。这类似于从同步函数返回值。
  • 拒绝在操作过程中发生了错误,并承诺是 - 拒绝原因。这类似于在同步函数中抛出错误。

当承诺被履行或拒绝时,据说承诺得到解决 (或解决 )。一旦承诺得到解决,它就会变成不可变的,它的状态也不会改变。该 thencatch 承诺的方法可用于连接时,它是解决了执行回调。这些回调分别用履行值和拒绝原因调用。

StackOverflow 文档

const promise = new Promise((resolve, reject) => {
    // Perform some work (possibly asynchronous)
    // ...

    if (/* Work has successfully finished and produced "value" */) {
        resolve(value);
    } else {
        // Something went wrong because of "reason"
        // The reason is traditionally an Error object, although
        // this is not required or enforced.
        let reason = new Error(message);
        reject(reason);

        // Throwing an error also rejects the promise.
        throw reason;
    }
});

thencatch 方法可用于连接完成和拒绝回调:

promise.then(value => {
    // Work has completed successfully,
    // promise has been fulfilled with "value"
}).catch(reason => {
    // Something went wrong,
    // promise has been rejected with "reason"
});

注意: 在同一个 promise 上调用 promise.then(...)promise.catch(...) 可能会在发生错误时导致 Uncaught exception in Promise,无论是在执行 promise 还是在其中一个回调中,因此首选的方法是将下一个侦听器附加到前一个返回的 promise 上 then / catch

或者,两个回调都可以通过一次调用附加到 then

promise.then(onFulfilled, onRejected);

将回调附加到已经解决的承诺将立即将它们放入微任务队列中 ,并且将尽快(即紧接在当前执行的脚本之后)调用它们。与许多其他事件发射实现不同,在附加回调之前没有必要检查 promise 的状态。

现场演示