加载中...
Promise 是 ES2015 引入的异步编程抽象,用状态机(pending / fulfilled / rejected)封装异步操作结果,彻底终结了回调地狱,并为后续的 async/await 语法奠定了基础。

| 正式引入 | ECMAScript 2015(ES6) |
| 社区前身 | Promises/A+ 规范,2012 年 |
| 三种状态 | pending / fulfilled / rejected |
一个 Promise 对象有且仅有三种状态,一旦从 pending 变为 fulfilled 或 rejected 就不可逆转。.then(onFulfilled, onRejected) 返回新的 Promise,使链式调用成为可能——每一节 .then 都可以转换值或抛出错误。.catch 是 .then(null, fn) 的语法糖,.finally(ES2018)无论成败都执行,常用于关闭 loading 状态。在此之前,社区已有 Q、Bluebird 等库实现了类似语义,ES6 的 Promise 规范很大程度上参考了 Promises/A+ 社区规范(2012 年)。[1]
Promise.all 全部成功才 resolve,任一失败立即 reject,适合并行请求且全部结果都必须用到的场景。Promise.allSettled(ES2020)等所有 Promise 落定,不管成败,返回每个结果的状态描述,适合批量操作统计成功/失败数量。Promise.race 取最先落定的那个,Promise.any(ES2021)取最先成功的那个——两者差异在于对「最快失败」的处理不同。实际项目中手写超时控制常用 Promise.race([fetch(url), timeout(5000)]) 模式。

| 正式引入 | ECMAScript 2015(ES6) |
| 社区前身 | Promises/A+ 规范,2012 年 |
| 三种状态 | pending / fulfilled / rejected |
登录 后参与讨论
暂无讨论,来发表第一条评论吧