创建一个空的承诺

Posted

技术标签:

【中文标题】创建一个空的承诺【英文标题】:Create an empty promise 【发布时间】:2013-05-20 15:09:21 【问题描述】:

我在一系列可能会或可能不会做某事的承诺中拥有一个功能。例如

  getYear().then(function(results)
    if(results.is1999) return party();
    else return Q.fcall(function()/*do nothing here*/);
  ).then(sleep)

其中getYearpartysleep 都返回承诺。有没有更简洁的方法来编写 else 语句?也就是说,什么都不做,但仍然返回一个可链接的承诺?

【问题讨论】:

return partyreturn party()? 感谢@Beetroot-Beetroot。固定。 我假设party 只是一个promise 值而不是一个返回promise 的函数。我还假设这两种方式都没有关系,因为这只是演示示例的代码。我现在不得不假设你真的在创建一个可以举办派对的程序,但前提是那是 1999 年。 哦,是的,这是生产代码,非常严肃。顺便说一句,感谢您非常彻底的回复。 【参考方案1】:

是的。 Q(value)value 返回一个承诺(如果 value 是一个承诺,它也会解包该值)。

  getYear().then(function(results)
    if(results.is1999) return party();
    else return Q(undefined);
  ).then(sleep)

或者,您可以通过不返回任何内容来获得完全相同的语义:

  getYear().then(function(results)
    if(results.is1999) return party();
  ).then(sleep)

如果你想要的是一个永远不会解决的承诺,你最好的选择是

  getYear().then(function(results)
    if(results.is1999) return party();
    else return Q.promise(function () );
  ).then(sleep)

你可以做的是重复使用相同的承诺:

  var stop = Q.promise(function () );
  getYear().then(function(results)
    if(results.is1999) return party();
    else return stop
  ).then(sleep)

【讨论】:

您所说的“从未解决的承诺”是什么意思?与返回值的承诺(例如,results)相比,这有什么优势吗? @Patrick Promises 可以处于以下三种状态之一:待处理、已完成和已拒绝。你可以让一个承诺永远保持在“待定”状态。这就是我所说的“永远不会解决的承诺”。我会说一般来说它是一种反模式,但如果你想阻止给定函数之后的所有逻辑发生,它可能会很有用。实际上,它允许您跳过链中的所有成功处理程序和所有失败处理程序。不过最好避免这样做。 是的,这似乎是个坏主意。示例中的什么导致承诺永远无法实现?因为最后的 .then(sleep) 返回一个永远不会分配给任何东西的承诺? (因此不能是.then'ed 或.done'ed?)

以上是关于创建一个空的承诺的主要内容,如果未能解决你的问题,请参考以下文章

像在 Q 中定义空的 Bluebird 承诺

带着承诺走一棵树

创建一个立即解决的“空”承诺

如何键入 Redux thunk 动作创建者以返回承诺

使用Bluebird承诺创建限制功能

我可以使用原型模式而不是闭包模式来创建解析为对象的承诺吗? [复制]