七、Promise 局限性
7.1 顺序错误处理
Promise 的设计局限性造成了一个很容易让人中招的陷阱,即 Promise 链中的错误很容易被无意中忽略掉。
如果构建了一个没有错误处理函数的 Promise 链,链中任何地方的任何错误都会在链中一直传播下去,直到被查看。
const p = fn(24)
.then(step2)
.then(step3)
// 注册拒绝处理函数
p.catch(handleErrors)
这个示例中 Promise 链中任何一个步骤都没有显式的处理错误。所以在 p 上注册一个拒绝错误处理函数,对于链中任何位置出现的错误,都可以得到通知。
7.2 单一值
每个 Promise 只能有一个完成值或一个拒绝理由:指的是 Promise 决议后的 resolve()
或 reject()
回调函数参数只能有一个。一般的建议是构造一个对象或数组,将多个值封装起来传递出去。
7.3 单决议
Promise 最本质的特征是: Promise 只能被决议一次(完成或拒绝)。这在许多异步情况中,直会获取一个值一次,所以这是没有问题的。不过,还有很多异步的情况适合另一种模式————一种类似与事件/数据流的模式,目前 Promise 还不能很好的用于这样的用例。
7.4 无法取消的 Promise
一旦创建了一个 Promise 并为其注册了完成/拒绝处理函数,就不能从外部停止它的进程,即使这个任务悬而未决,也没有办法停止。
7.5 Promise 性能
更多的工作,更多的保护。这些意味着 Promise 与不可信任的裸回调相比会更慢一些。
另外一个微妙的问题是:Promise 使一切都成为异步了,即有一些立即完成的步骤仍然会延迟到任务的下一步。
Promise 稍慢一些,但是作为交换,你得到的是大量内建的可信任性代码。
参考链接
- 《你不知道的JavaScript(中卷)》