Q.Promise数组,如果满足1以上则发出警报

时间:2015-12-13 12:42:05

标签: javascript promise q deferred

我使用Q库来处理承诺。 让我们说我有一系列的承诺,我等待第一个承诺,以便返回它的价值。

我只期待其中一项承诺得以实现,但我不能保证这种情况,因此如果在第一项承诺之后履行了另一项承诺,我还想做一些承诺。

显然我可以使用Q.allSettled,但是在我能够访问第一个履行承诺的价值之前,我必须等待所有承诺得到履行/拒绝。

我想知道是否有办法在仍然处理其他承诺的同时获取第一个承诺的价值,所以我可以提醒另一个承诺是否已经完成。

希望我的问题很明确,谢谢你的帮助。

Edit1 - 代码段

如您所见,此代码返回第一个履行的承诺的值。 我希望保持这种行为,同时如果第二个承诺得以实现仍然能够采取行动。

GetDataSource(profileId): Q.Promise<DataSource>

Edit2 - 更多信息

如果您了解上述代码应该做什么,我会有一个通用的input: profileId函数(output: a promise for a DataSourceQ.any(promises))。

我需要将第一个履行承诺的价值返回给任何一个叫我的人,只要它完成了 - 这意味着我需要返回Q.allSettled(promises).then(function(result){ if(result.filter(function(p){ return p.state === "fulfilled"; })){ alert("Sanity failure"); // do whatever you need to recover } }); 。 另一方面,我仍然需要执行这部分代码(Benjamin Gruenbaum&#39;)

{{1}}

你建议我做什么? (对不起以前不够清楚)

1 个答案:

答案 0 :(得分:2)

您可以分叉承诺并创建多个分支:

var promises = tables.map(function(table) { 
    return getDataSourcePromise(table, profileId.toString());
});

Q.any(promises).then(function(result){
   console.log("Result", result); // processing done
});
Q.allSettled(promises).then(function(result){
    if(result.filter(function(p){ return p.state === "fulfilled"; })){
       alert("Sanity failure"); // do whatever you need to recover
    }
});