创建一个空的承诺
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)
其中getYear
、party
和sleep
都返回承诺。有没有更简洁的方法来编写 else 语句?也就是说,什么都不做,但仍然返回一个可链接的承诺?
【问题讨论】:
return party
或 return 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?)以上是关于创建一个空的承诺的主要内容,如果未能解决你的问题,请参考以下文章