我明白使用Q
庫可以很容易地等待一些承諾來完成,然後用對應於那些承諾的結果值列表工作:節點承諾:先用/任何結果(Q庫)
Q.all([
promise1,
promise2,
.
.
.
promiseN,
]).then(results) {
// results is a list of all the values from 1 to n
});
但是,如果我只對單一,最快的完成結果感興趣,會發生什麼?給出一個用例:假設我有興趣檢查一大堆文件,並且只要找到包含「津巴布韋」一詞的任何文件,我就會滿意。
我能做到這一點是這樣的:
Q.all(fileNames.map(function(fileName) {
return readFilePromise(fileName).then(function(fileContents) {
return fileContents.contains('zimbabwe') ? fileContents : null;
}));
})).then(function(results) {
var zimbabweFile = results.filter(function(r) { return r !== null; })[0];
});
但我需要處理完所有的文件,即使我已經找到了「津巴布韋」。如果我有一個包含「津巴布韋」的2kb文件和一個不包含「津巴布韋」的30tb文件(並且假設我在異步讀取文件) - 這是愚蠢的!
我希望能夠做的就是得到一個值的時刻任何承諾滿足:
Q.any(fileNames.map(function(fileName) {
return readFilePromise(fileName).then(function(fileContents) {
if (fileContents.contains('zimbabwe')) return fileContents;
/*
Indicate failure
-Return "null" or "undefined"?
-Throw error?
*/
}));
})).then(function(result) {
// Only one result!
var zimbabweFile = result;
}).fail(function() { /* no "zimbabwe" found */ });
用這種方法我會,如果「津巴布韋」中發現無法在我的30TB文件等待我的2kb文件在早期。
但是沒有Q.any
這樣的東西!
我的問題:我如何得到這種行爲?
重要注意事項:即使內部承諾之一發生錯誤,也應該無錯地返回。
注:我知道我可以通過在找到第一個有效值時拋出一個錯誤來破解Q.all
,但我更願意避免這種情況。
注意:我知道類似Q.any
的行爲可能不正確,或者在許多情況下不合適。請相信我有一個有效的用例!
dunno如果Q支持它,但本機的承諾當然會。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race –
@KevinB好點,修正!我可以想象將Q和本地承諾混合並不合適?你知道這個共識是什麼嗎? –
@KevinB在其他消息中,實際上有'Q.race'這樣的東西 - 它沒有記錄,但它存在。如果你添加一個答案,我會給你支票! –