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 的状态?让我知道!