蓝鸟:等待一个承诺解决

冒着听起来很愚蠢的风险:等待一个承诺解决的最有效的方法是什么? 说我有承诺A,我想创造承诺B,B的实现不取决于A的最终价值。即使A被拒绝,它也应该继续。 然而,这个过程不应该开始,直到A以某种方式解决。

我目前看起来如下所示:

var prevResult; function doStuff() { if (prevResult) { prevResult = promise.settle([ prevResult ]).then(function() { return doStuff(); }) } else { prevResult = updateDB().finally(function() { prevResult = null; }); } return prevResult; } 

代码有点不明显。 我也有点担心把一堆来自sett()的承诺链接在一起,看看它是如何执行不那么简单的协调的function。 似乎应该是一个更简单的方法来做到这一点。

最近, .reflect被引入作为一个更灵活和更好的抽象。 你的使用案例听起来像是很容易做的.reflect

 A.reflect().then(function(){ return doSomethingThatReturnsB(); }); 

你的代码的完整例子:

 var prevResult; function doStuff() { prevResult = Promise.resolve(prevResult).reflect().then(function(){ return updateDB(); }); return prevResult; } 

最后可以使用,不pipe前面的承诺的结果如何,都会触发。

以下代码来自蓝鸟github doco。

 function ajaxGetAsync(url) { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest; xhr.addEventListener("error", reject); xhr.addEventListener("load", resolve); xhr.open("GET", url); xhr.send(null); }).finally(function() { $("#ajax-loader-animation").hide(); }); } 

假设您有两个承诺返回函数doAsync_AdoAsync_B

下面的expression式将执行doAsync_A ,等待它的承诺解决(成为履行或拒绝),然后执行doAsync_B

 Promise.settle([doAsync_A()]).then(doAsync_B); 

doAsync_B将被传递一个“PromiseInspection”数组(这里是一个单独的元素)。 如有必要,您可以testingdoAsync_A是成功还是失败。

 function doAsync_B(results) { var r = results[0]; if (r.isFulfilled()) { // check if was successful console.log(r.value()); // the promise's return value } else if (r.isRejected()) { // check if the read failed console.log(r.reason()); // the promise's rejection reason } } 

改编自蓝鸟文件

我认为最好的办法是将doStuff作为履行和拒绝处理程序:

 prevResult = prevResult.then(function() { return doStuff(); }, function() { return doStuff(); }); 

或者,

 prevResult = prevResult.catch(ignore).then(function() { return doStuff(); }); 

看来你正在尝试队列updateDB操作。 我build议不要将prevResult重置为null ,而只是将它作为所有排队操作完成时履行的承诺。 看看这个例子 。