我应该在ES6节点项目中使用promises多少钱?

时间:2015-08-28 09:17:08

标签: javascript node.js promise ecmascript-6 es6-promise

在官方蓝鸟承诺页面中写道,如果你使用node.js,我不太可能自己写承诺。

自从我开始一个新项目以来,我发现我所有的代码库都围绕着promises。例如,我有一个返回promise的databaseConnector,一个接受promise的快速路由,使用chai-as-promise测试promises的测试,一般来说我没有编写任何接收回调的函数。

我应该编写回调模块吗?如果需要,可以将它们统一起来吗?

有什么缺点?

2 个答案:

答案 0 :(得分:2)

  

我应该在ES6节点项目中使用promise吗?

是的,确切地说。 Promise是 new 标准异步接口。

  

在官方蓝鸟承诺页面中写道,我不太可能自己写承诺。

不完全是。它们的含义here是您几乎不需要使用new Promise构造函数 - 它的大部分用法都是an antipattern
您将希望在任何地方使用promise ,但您不希望从回调中明确创建它们。如果你有异步代码进行回调,promisification比{{1}}更容易使用。

  

自从我开始一个新项目以来,我发现我所有的代码库都围绕着承诺

你很幸运!您正在使用的所有功能已经返回并期望承诺 - 这太棒了!你可以使用它们,拥抱它们。您不必担心承诺代码中的奇怪回调模式。

  

我应该编写回调模块吗?如果需要,可以将它们统一起来吗?

没有。特别是如果您使用的所有API已经使用了promises。 Promise使代码更简单,更正确。 They're just great

答案 1 :(得分:1)

回调相比,您几乎应该总是使用 promises 。它们更具可读性,解决了一些嵌套问题,并提供了一种标准化的方式来通知错误(使用reject())。

官方蓝鸟承诺页面的意思是

  • 在节点上,您经常可以使用流来解决更高效的问题(比如gulp),在这里你经常会有回调而不是承诺(想想es.map()
  • 正如您提到的 es6 ,您可以使用generators而不是回调/承诺。他们不能很好地协同工作,所以坚持使用其中一种,但在某些情况下它们很方便。
  • 您甚至可以使用 es7 功能async/await,这有望在将来废弃所有其他功能。

回调的缺点。嗯......他们曾经continuations,没有编译器设计师甚至想到直接打扰语言用户。然后node.js来了,现在每个人都写无休止的嵌套函数调用不可读(甚至不考虑调试),不提供方法用于错误处理(除了将err作为回调的第一个参数的事实标准之外)并且不能与同步代码良好地交互。