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: profileId
,output: 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
}
});
我正在使用 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: profileId
,output: 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
}
});