在阅读了几篇关于es6承诺有多大以及我们为什么要实现它们的文章之后,我一直觉得 ALL 我的(非平凡的)javascript函数应该是promises。
事实上,在使用它们编写代码时我感觉很棒,因为我避免了厄运的三角形,看起来似乎得到了清晰简洁的代码。 (它确实使执行的推理变得更加简单)。
我无法找到的是:你什么时候不使用承诺?我什么时候避免使用它们?
更新
虽然我已经看到了API一致性方面的一些重点,但我还没有找到一个可靠的案例。 Lux的答案表明,获取事件发射器的操作应该避免它们,因为重复的回调与promises不兼容。然而,我确实觉得答案仍然缺乏实质性的检查(正确)。
答案 0 :(得分:16)
一些经验法则:
当您的方法可以同步(简单数据转换)时,请在该方法中使用同步代码。
但是,如果该方法可以是有时,而异步有时(基于内部或外部状态的多个代码路径),则它应该是异步的 总是 即可。否则,您可能会遇到代码在复杂场景中的行为方式出现意想不到的微妙差异,因此最好避免混淆这两种态度。
[edit]正如评论中所述,当你的方法暂时是同步的,但你坚信它可能需要在将来的某个时刻进行异步工作时,你可能希望从一开始就使用promises来避免代价高昂的重构
通常,您的API应该是一致的,因此最好在任何地方使用promises,或者在任何地方使用回调。这样可以更容易推理代码。
如果您正在编写超高性能代码和/或需要较少的内存占用,您可以考虑不使用promises而是使用回调,或使用专注于性能的promise库,例如bluebird,本机Promise实现/一般用例polyfill。
[edit]无论如何,网络平台的新增内容,如全球fetch功能,返回Promise
,似乎在未来的未来会有越来越多的浏览器内置版本将履行承诺。所以如果你愿意写现代代码,你就不会逃避承诺。
答案 1 :(得分:9)
您使用promises进行一次性异步操作。启动操作,执行操作,通知调用者完成或结果或错误,然后完成。
不使用承诺的情况是与上述不同的情况:
答案 2 :(得分:6)
Well Promises有一个用例:异步结果只有一次。
如果您可以同步返回结果,则不使用Promise,并且仍然需要回调事件,因为它们可能会多次出现。
答案 3 :(得分:1)
如果您希望代码在浏览器中运行(可能没有内置Promise)并且真的很可能很重要,那么您可能决定不使用Promises,因此您无法使用承诺垫片/库。
答案 4 :(得分:1)
大多数情况下,承诺都会用于轻松完成任务。有时我们故意做一些异步的事情,以避免线程的重载,我们使用它。我们每个标签只有一个帖子。当小的东西或可以用WebWorker制作的东西时,不需要使用promises。