【问题标题】:How much should I be using promises in ES6 node projects?我应该在 ES6 节点项目中使用多少 Promise?
【发布时间】:2015-08-28 09:17:08
【问题描述】:

在官方 bluebird promises 页面中写道,如果您使用的是 node.js,那么我不太可能必须自己编写 promises。

自从我开始一个新项目以来,我发现我的所有代码库都围绕着 Promise。例如,我有一个返回承诺的数据库连接器,一个接受承诺的快速路由,使用 chai-as-promised 进行测试以测试承诺,而且通常我还没有编写任何接收回调的函数。

我应该编写回调模块并在需要时承诺它们吗?

如果有什么缺点?

【问题讨论】:

  • 承诺很棒。尽可能多地使用它们。如果适用,请公开从您的模块返回它们的函数,因为不同的实现可以相互转换。

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


【解决方案1】:

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

是的,肯定的。 Promise 是 new 标准异步接口。

在官方 bluebird 承诺页面上写到,我不太可能必须自己写承诺。

不完全是。 here 的意思是你几乎不需要使用 new Promise 构造函数 - 它的大部分用法是 an antipattern
你会希望在任何地方都使用promise,但你不想通过回调显式地创建它们。如果你有异步代码需要回调,promisificationnew Promise 更容易使用。

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

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

我应该编写回调模块并在需要时承诺它们吗?

没有。如果您正在使用的所有 API 都已经使用了 Promise,则尤其如此。 Promise 使代码更简单、更正确。 They're just great.

【讨论】:

    【解决方案2】:

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

    官方蓝鸟承诺页面可能意味着

    • 在节点上,您通常可以使用流(例如 gulp)解决更高效的问题,在这种情况下,您通常使用回调而不是承诺(想想 es.map()
    • 正如您提到的es6,您可以使用generators 而不是回调/承诺。它们不能很好地协同工作,因此请坚持使用其中一个,但在某些情况下它们很方便。
    • 您甚至可以使用 es7 功能 async/await,这有望在未来使其他一切都过时。

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

    【讨论】:

    • 谢谢。你认为既然我使用的是 babel-node,我应该从现在开始让我所有的后端都使用 asyc/await 吗?我有点害怕这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2015-12-24
    • 1970-01-01
    • 2016-09-12
    • 2020-02-29
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多