![](/img/trans.png)
[英]Execute at most N tasks in parallel using JS promises or generators
[英]generators + promises to parallelize N number of items
挑戰:
例如:
即使2,3,5在1之前返回,我們也應保留2,3,5的結果,並在返回1時依次處理1,2,3(並等待4在5之前返回)
工具:Q + ES6生成器
使用占位符變量創建N-1個長度的數組
N = 3時的EG
let [N1,N2,N3] = yield [ Promise1, Promise2, Promise3 ]
//process items sequentially:
console.log(N1)
console.log(N2)
console.log(N3)
但是,填充空變量數組似乎似乎不起作用,因為引用不知道在哪里可以找到var聲明。
for(var i = 0; i< 3; i++) {
res.push("some empty var")
}
考慮到使用所提供工具的限制,我們如何並行化調用,但按順序處理它們的返回?
您可以使用Promise.all()
.then()
答案中的javascript
返回問題中所述的確切結果
- 我們要為項目的子項提出N個並行的ajax請求。
- 返回后,我們要按順序處理它們(1 ... N)
- 我們不想等待所有的承諾都返回,但是我們希望在它們返回時按順序進行處理。 我們如何並行化調用,但順序地處理它們的返回?
您可以使用.then()
鏈接到它返回一個承諾或原有功能Promise
對象本身處理之前的承諾return
以傳遞給參數順序進行處理荷蘭國際集團價值Promise.all()
的.then()
拴Promise.all()
var n = 0; var fn = function() { return new Promise(function(resolve, reject) { console.log("promise " + ++n + " called"); setTimeout(function(i) { resolve(i) }, Math.random() * 2500, n) }) // handle requirement 3. here .then(function(res) { console.log(res); return res }) } Promise.all([fn(), fn(), fn()]) // handle requirement 1. here // handle requirement 2. here .then(function(data) { let [N1, N2, N3] = data; console.log(N1, N2, N3); })
您可以通過等待循環中的下一個承諾來做到這一點:
const promises = […]; // or created programmatically
for (const promise of promises) {
const result = yield promise; // await them sequentially
console.log(result);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.