javascript – Q.Promise数组,如果超过1,则发出警报

我正在使用
Q库来处理承诺.

让我们说我有一系列的承诺,我正在等待第一个承诺,以便返回它的价值.

我期待只有一个承诺能够实现,但我不能保证这种情况,因此如果在第一个承诺之后履行了另一个承诺,我想做一些事情.

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

我想知道是否有办法在仍然处理其他承诺的同时访问第一个承诺的价值,所以如果满足另一个承诺,我可以提醒.

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

Edit1 – 代码段

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

var getDataSourcePromise = function(table, profileId) {
    var deferred = Q.defer();

    table.retrieveEntity(tableName, profileId, profileId, function(err, result, response) {
        if (err) {
            deferred.reject(Error(err));
        }
        else {
            deferred.resolve(result);
        }
    });

    return deferred.promise;
}

var promises = [];
tables.forEach(function(table, profileId) {
    promises.push(getDataSourcePromise(table, profileId.toString()));
});

console.log('waiting for settle');

Q.any(promises).then(function(result) {
    console.log(result);
});

Edit2 – 更多信息

如果您了解上面的代码应该做什么,我有一个通用的GetDataSource(profileId):Q.Promise< DataSource> function(输入:profileId,输出:DataSource的承诺).

我需要将第一个履行承诺的价值返还给任何一个叫我的人,只要它完成了 – 意味着我需要返回Q.any(承诺).
另一方面,我仍然需要执行这部分代码(Benjamin Gruenbaum):

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

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

最佳答案 您可以派生承诺并创建多个分支:

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
    }
});
点赞