【问题标题】:In Nodejs when using the q (promises) module, what is the value returned by then()?在 Nodejs 中使用 q (promises) 模块时,then() 返回的值是多少?
【发布时间】:2014-05-22 17:16:30
【问题描述】:

我不是在询问承诺的履行价值。

这里我问的是then()函数的返回值。我关心的具体事情是根据条件构建承诺列表,例如:

function operationThatReturnsPromise() {

  var p = q.resolve({ prop1 : value1 })
         .then(function(ctx) {.... return ctx;});

  if (condition1) { 
   // which usage is required or preferred?

   // 1.  p = p.then() ? 
   p = p.then(function(ctx) { ..... return ctx; } );

   // 2. p.then() ? 
   p.then(function(ctx) {... return ctx; });

  } 

  return p;
}

它们是等价的吗? doc at Mozilla 状态

返回一个新的 Promise,其状态取决于该 Promise 和提供的回调函数。

这似乎表明前者(选项 1)是首选。有什么指导吗?

【问题讨论】:

  • 我看到你的背景是.NET,把.then想象成Task的.ContinueWith,你最终会返回一个任务。

标签: node.js promise q


【解决方案1】:

您应该始终使用选项 1。

Promise 是不可变的; .then() 返回一个带有回调(最终)结果的新承诺。

如果你忽略它的返回值,你将永远不会等待操作完成,更糟糕的是,任何失败都会被默默吞下。

【讨论】:

  • 值得一提的是,像 Bluebird 这样好的 Promise 库或 Firefox 中的原生 Promise 不会默默吞下异常。
【解决方案2】:

只做测试,选项 2 不起作用。如果你想要一个用ctx 解析的promise,你必须返回then(function(ctx) {... return ctx; }) 的返回值。使用选项 2,此返回值将永远丢失。

顺便问一下,请大家检查一下 Q 的基准,并意识到你应该使用 bluebird,这是我所知道的唯一一个性能非常好的 promise 库。

【讨论】:

  • 许多 Promise 库开发人员关心性能。 Petka 比其他大多数人更了解它。
  • 是的。也许这有点夸张。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2021-09-10
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多