Javascript 什么时候不使用承诺

Javascript 什么时候不使用承诺,javascript,node.js,promise,es6-promise,Javascript,Node.js,Promise,Es6 Promise,在阅读了几十篇关于es6承诺有多伟大以及为什么我们应该实现它们的文章之后,我有一种感觉,我的所有(非平凡的)javascript函数都应该是承诺 事实上,我在使用它们编写代码时感觉很棒,因为我避免了厄运三角,似乎得到了清晰简洁的代码。(这确实让执行的推理变得简单多了) 我没能找到的是:你什么时候不使用承诺?我什么时候可以避免使用它们 更新: 虽然我已经看到了API一致性这样的一些优点,但我还没有找到一个可靠的“无”案例。Lux的回答表明,获取事件发射器的操作应该避免它们,因为重复的回调与承诺不兼

在阅读了几十篇关于es6承诺有多伟大以及为什么我们应该实现它们的文章之后,我有一种感觉,我的所有(非平凡的)javascript函数都应该是承诺

事实上,我在使用它们编写代码时感觉很棒,因为我避免了厄运三角,似乎得到了清晰简洁的代码。(这确实让执行的推理变得简单多了)

我没能找到的是:你什么时候不使用承诺?我什么时候可以避免使用它们

更新:


虽然我已经看到了API一致性这样的一些优点,但我还没有找到一个可靠的“无”案例。Lux的回答表明,获取事件发射器的操作应该避免它们,因为重复的回调与承诺不兼容。然而,我确实觉得现在的答案仍然缺乏实质性内容来检查它(是否正确)。

Well Promissions有一个用例:异步结果只出现一次


如果可以同步返回结果,则不使用承诺,并且仍然需要对事件进行回调,因为事件可能会多次发生。

如果希望代码在浏览器中运行(可能没有内置承诺),则可以决定不使用承诺,并且大小非常重要,因此,您负担不起使用Promise/libs。

大多数情况下,Promise用于简化异步任务的处理。有时,我们故意异步执行一些操作,以避免工作线程过载,因为每个选项卡只有一个线程。当事情很小或可以由网络工作者处理时,不需要承诺。

一些经验法则:

  • 如果您的方法可以是同步的(简单的数据转换),那么在该方法中使用同步代码

    但是,如果该方法有时是同步的,有时是异步的(基于内部或外部状态的多个代码路径),那么它应该是异步的始终。否则,您可能会在复杂场景中的代码行为中遇到意想不到的细微差异,因此最好避免混合这两种态度

    [edit]如评论中所述,当您的方法目前是同步的,但您坚信它可能需要在将来某个时候进行异步工作时,您可能希望从一开始就使用承诺,以避免代价高昂的重构

  • 一般来说,您的API应该是一致的,所以最好在任何地方使用承诺,或者在任何地方使用回调。这将更容易对代码进行推理

  • <> >如果您编写超高性能代码和/或需要低内存占用,则可以考虑不使用承诺但回调,或者使用具有性能重点的承诺库,而不是本机承诺实现/通用用例PulePuth.

  • [编辑]无论如何,web平台的新添加,如global function,将返回一个
    承诺
    ,而且在未来,似乎越来越多的浏览器内置将基于承诺运行。因此,如果您愿意编写现代代码,就不会逃避承诺


  • 您可以对一次性异步操作使用承诺。启动操作,执行操作,通知调用者操作完成或结果或错误,然后永久完成

    不使用承诺的情况与上述情况不同:

  • 当您的操作或功能完全同步时。将异步API(即使有承诺)放在同步操作上只会使事情变得比需要的更复杂
  • 代替可能发生多次的事件。例如,您不会对按钮单击处理程序使用承诺。eventEmitter或其他类似事件的结构仍然是循环事件的更好结构
  • 当您遇到回调情况时,回调被设计为多次调用(例如通过回调报告进度或提供插件服务)
  • 如果要将一个新操作添加到已经以其他方式设计的API中(例如,使用传统回调),则需要API一致性
  • 如果您针对的是本机不支持承诺(如旧浏览器)的较旧环境您正在尝试优化代码的下载大小,您只需要执行一到两个异步操作,而不是使用jQuery或Angular之类的内置承诺形式的东西。如果您正在做大量的异步工作,那么可能值得使用Promises polyfill,因此这一点仅适用于大小非常重要且异步工作非常少的情况
  • 对于动作通常未完成或发生的情况。承诺是具有状态的对象,因此会消耗一些内存。创建数千个承诺来获得通常不会发生的许多不同事情的通知是没有意义的,因为这将创建数千个承诺对象(通常带有其附带的闭包),而这些对象基本上永远不会被使用。这只是低效的内存使用,通过某种事件通知可能会更好。正如我上面所说的,当您启动操作、执行操作、将结果或错误通知调用方时,承诺最有效

  • 当您使用RxJS时:只要我100%确定我的代码将同步执行,DI就会避免使用承诺。在任何其他情况下,承诺都会让你的生活变得更轻松。关于再次发生回调事件的观点非常重要!假设我想从另一个程序或库中获取结果?I/O是一项棘手的工作,因此为了安全起见,我会选择在这一点上一直遵守承诺。这是个坏习惯吗?我应该只在100%确定结果(或副作用)时才履行承诺吗