簡體   English   中英

順序執行許多承諾(概念)

[英]Execute many promises sequentially (Concept)

(我的目標是闡明有關問題的概念,而不是代碼)

我想按順序執行一個promise數組,但是nodeJS拋出了一個關於並行執行的許多promise的奇怪錯誤(因為我將數組限制為20個promise和works,50個promise and works,但是9000個promise and explode。)

  • 我知道我們有一些解決方案,例如array.reduce(),循環等
  • 我知道諾言狀態(我的數組最初有未完成的諾言)

我的問題:我可以執行20個Promise ,然后再執行20個Promise,依此類推 ,但是... 如果我按順序執行我的Promise,nodeJS必須執行9k個Promise沒有問題? 我的觀念不好嗎? 我的代碼錯了嗎?

(令人懷疑,因為nodeJS在開始兌現承諾之前要等待一段時間)

我的情況:我嘗試下載9k +圖像(使用axios),然后保存每個圖像,然后依次等待5秒鍾。 [下載1張圖像,保存該圖像,等待5秒鍾,然后下載下一張圖像,保存..,等待...,等等。]可能嗎?

我本來會使用諸如工作池之類的方法,而不是每次執行20次批處理,您總是會在等待下一個批處理開始之前總是等待最后一個完成,而應該設置連續多少次的限制下載要執行的操作,這樣您就不會超過20個承諾,而且沒有9000個長鏈

迭代器也可以完成同一件事。 (同一個迭代器可以傳遞給不同的工作程序,而當某人調用第一個項目時,下一個工作程序將始終獲得下一個工作程序)

因此,在零依賴性的情況下,我將執行以下操作:

const sleep = n => new Promise(rs => setTimeout(rs, 1000))

async function sequentialDownload(iterator) {
  for (let [index, url] of iterator) {
    // figure out where to save the file
    const path = path.resolve(__dirname, 'images', index + '.jpg')
    // download all images as a stream
    const res = await axios.get(index, { responseType: 'stream' })

    // pipe the stream to disc
    const writer = fs.createWriteStream(path)
    res.data.pipe(writer)

    // wait for the download to complete
    await new Promise(resolve => writer.on('finish', resolve))
    // wait a extra 5 sec
    await sleep(5000)
  }
}

const arr = [url1, url2, url3] // to be downloaded
const workers = new Array(20) // create 20 "workers"
  .fill(arr.entries()) // fill it with same iterator
  .map(sequentialDownload) // start working

Promise.all(workers).then(() => {
  console.log('done downloading everything')
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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