Promises改变了 JavaScript 的面貌。许多旧的 API 已经转世使用 Promises(XHR 来获取, Battery API ),而新的 API 则倾向于使用 Promises。开发人员可以使用async / await来处理 promises,或者then / catch / finally回调,但是 Promises 不会告诉你它们的状态。如果Promise.prototype为开发人员提供status属性以了解承诺是被拒绝、已解决还是刚刚完成,那不是很好吗?
我的研究使我找到了这个我发现非常聪明的要点。我花了一些时间修改了一些代码并添加了注释。以下解决方案提供了用于确定 Promise 状态的辅助方法:
// 使用 setTimeout 和 Promise 创建任意延迟时间
// 在这些例子中,0 毫秒的延迟是
// 一个立即解决的承诺,我们可以根据它来判断状态
异步函数延迟(毫秒 = 0,returnValue){
return new Promise(done => window.setTimeout((() => done(returnValue)), 毫秒));
}
// 所有这些函数中的 Promise.race 使用延迟 0 到
// 立即解决。如果承诺被解决或拒绝,
// 返回该值将在比赛中击败 setTimeout
异步函数已解决(承诺){
返回 await Promise.race([delay(0, false), promise.then(() => true, () => false)]);
}
异步函数 isRejected(promise) {
返回 await Promise.race([delay(0, false), promise.then(() => false, () => true)]);
}
异步函数已完成(承诺){
返回 await Promise.race([delay(0, false), promise.then(() => true, () => true)]);
}
几个使用示例:
// 测试已解决 await isResolved(new Promise(resolve => resolve())); // 真的 await isResolved(new Promise((_, reject) => reject())); // 错误的 // 测试被拒绝 await isRejected(new Promise((_, reject) => reject())); // 真的 // 我们完成了吗? await isFinished(new Promise(resolve => resolve())); // 真的 await isFinished(new Promise((_, reject) => reject())); // 真的
开发人员总是可以在 Promise 中添加另一个await或then来执行某些操作,但弄清给定 Promise 的状态很有趣。有没有更简单的方法来了解 Promise 的状态?让我知道!