簡體   English   中英

生成器+承諾並行化N個項目

[英]generators + promises to parallelize N number of items

挑戰:

  1. 我們要為項目的子項提出N個並行的ajax請求。
  2. 返回后,我們要按順序處理它們(1 ... N)
  3. 我們不想等待所有的承諾都返回,但是我們希望在它們返回時按順序進行處理。

例如:

即使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返回問題中所述的確切結果

  1. 我們要為項目的子項提出N個並行的ajax請求。
  2. 返回后,我們要按順序處理它們(1 ... N)
  3. 我們不想等待所有的承諾都返回,但是我們希望在它們返回時按順序進行處理。 我們如何並行化調用,但順序地處理它們的返回?

您可以使用.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM