Skip to content

搞英语 → 看世界

翻译英文优质信息和名人推特

Menu
  • 首页
  • 作者列表
  • 独立博客
  • 专业媒体
  • 名人推特
  • 邮件列表
  • 关于本站
Menu

如何确定 JavaScript Promise 的状态

Posted on 2023-01-04

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

如何确定 JavaScript Promise 的状态一文首先出现在David Walsh 博客上。

原文: https://davidwalsh.name/get-promise-status

本站文章系自动翻译,站长会周期检查,如果有不当内容,请点此留言,非常感谢。
  • Abhinav
  • Abigail Pain
  • Adam Fortuna
  • Alberto Gallego
  • Alex Wlchan
  • Answer.AI
  • Arne Bahlo
  • Ben Carlson
  • Ben Kuhn
  • Bert Hubert
  • Bits about Money
  • Brian Krebs
  • ByteByteGo
  • Chip Huyen
  • Chips and Cheese
  • Christopher Butler
  • Colin Percival
  • Cool Infographics
  • Dan Sinker
  • David Walsh
  • Dmitry Dolzhenko
  • Dustin Curtis
  • Elad Gil
  • Ellie Huxtable
  • Ethan Marcotte
  • Exponential View
  • FAIL Blog
  • Founder Weekly
  • Geoffrey Huntley
  • Geoffrey Litt
  • Greg Mankiw
  • Henrique Dias
  • Hypercritical
  • IEEE Spectrum
  • Investment Talk
  • Jaz
  • Jeff Geerling
  • Jonas Hietala
  • Josh Comeau
  • Lenny Rachitsky
  • Liz Danzico
  • Lou Plummer
  • Luke Wroblewski
  • Matt Baer
  • Matt Stoller
  • Matthias Endler
  • Mert Bulan
  • Mostly metrics
  • News Letter
  • NextDraft
  • Non_Interactive
  • Not Boring
  • One Useful Thing
  • Phil Eaton
  • Product Market Fit
  • Readwise
  • ReedyBear
  • Robert Heaton
  • Ruben Schade
  • Sage Economics
  • Sam Altman
  • Sam Rose
  • selfh.st
  • Shtetl-Optimized
  • Simon schreibt
  • Slashdot
  • Small Good Things
  • Taylor Troesh
  • Telegram Blog
  • The Macro Compass
  • The Pomp Letter
  • thesephist
  • Thinking Deep & Wide
  • Tim Kellogg
  • Understanding AI
  • 英文媒体
  • 英文推特
  • 英文独立博客
©2025 搞英语 → 看世界 | Design: Newspaperly WordPress Theme