Q.Promise 数组,超过 1 个时发出警报

Q.Promise array, alert if more than 1 fulfilled

我正在使用 Q 库来处理承诺。 假设我有一系列承诺,我正在等待第一个承诺兑现,以便 return 它的价值。

我只希望兑现其中一个承诺,但我不能保证会出现这种情况,因此如果在第一个承诺之后又兑现了另一个承诺,我想做点什么。

显然我可以使用 Q.allSettled 但是我必须等待所有的承诺成为 fulfilled/rejected 才能访问第一个已履行的承诺的价值。

我想知道是否有一种方法可以访问要 returned 的第一个 promise 的值,同时仍然处理其他 promise,这样我可以在另一个 promise 完成时发出警报。

希望我的问题很清楚,感谢您的帮助。

Edit1 - 代码片段

如您所见,此代码 return 是第一个已履行承诺的值。 我想保持这种行为,同时在实现第二个承诺时仍然能够采取行动。

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> 函数(input: profileIdoutput: a promise for a DataSource)。

我需要 return 对任何打电话给我的人的第一个已兑现的承诺的价值,一旦兑现 --- 这意味着我需要 return Q.any(promises)。 另一方面,我仍然需要执行这部分代码(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
    }
});

你建议我做什么? (抱歉之前不够清楚)

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

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