Promise 介绍
一个 Promise
对象表示的操作已产生或将最终产生的值。Promises 提供了一种强大的方法来包装异步工作的(可能是待定的)结果,减轻了深层嵌套回调的问题(称为“ 回调地狱 ”)。
国家和控制流程
承诺可以是以下三种状态之一:
- 待定 - 基础操作尚未完成,承诺尚未完成。
- 完成 -该操作已完成,并承诺被兑现了价值。这类似于从同步函数返回值。
- 拒绝在操作过程中发生了错误,并承诺是 - 拒绝与原因。这类似于在同步函数中抛出错误。
当承诺被履行或拒绝时,据说承诺得到解决 (或解决 )。一旦承诺得到解决,它就会变成不可变的,它的状态也不会改变。该 then
和 catch
承诺的方法可用于连接时,它是解决了执行回调。这些回调分别用履行值和拒绝原因调用。
例
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;
}
});
该 then
和 catch
方法可用于连接完成和拒绝回调:
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 的状态。