2017-01-12 31 views
2

我需要使用Promise.each on bluebird。但是當我看到捆綁文件時,我實際上正在考慮使用藍鳥或不使用。Promise.each without bluebird

任何人都可以給我一個例子使用像藍鳥Promise.each功能沒有依賴關係。

+0

FTR - 藍鳥有局部和定製構建 - 你可以得到它低至5KB –

+0

我該怎麼做?試圖導入'require(bluebird/each)'不工作 –

回答

7

肯定的:

Promise.each = function(arr, fn) { // take an array and a function 
    // invalid input 
    if(!Array.isArray(arr)) return Promise.reject(new Error("Non array passed to each")); 
    // empty case 
    if(arr.length === 0) return Promise.resolve(); 
    return arr.reduce(function(prev, cur) { 
    return prev.then(() => fn(cur)) 
    }, Promise.resolve()); 
} 

或用現代JS(Chrome或邊或有一個transpiler):

Promise.each = async function(arr, fn) { // take an array and a function 
    for(const item of arr) await fn(item); 
} 
+0

感謝它的作品。 –

+0

請注意,'empty case'永遠不會在這裏測試,因爲0是虛假的,所以'!arr.length'將導致空數組作爲非數組被拒絕而不是被解析。 使用'!(arr instanceof Array)'更好。 – Findiglay

+0

'空檢查'是不必要的,因爲如果數組爲空,Array.prototype.reduce()將返回'initialValue'('Promise.resolve()')。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce – pickypg

-1

如果我們看一下MDNPromise文檔,你會發現有兩種方法可以使用。 allrace,前者在所有承諾都被解決,而後者在第一個承諾解決時結束時結束。

這應該爲您提供工具來完成您對藍鳥Promise.each所能做的一切。如果它還沒有解決你的問題,請說明你的具體問題,我會看看我能否幫助你。

+0

這個答案會是一個更好的評論。但最重要的是,'Promise.each'的工作方式並不準確(可預測的命令是異步觸發的操作)。 'Promise.all'和'Promise.race'都不提供任何關於訂單的想法(特別是「種族」,這是「第一個獲勝」)。 – pickypg