Promise.all
выбросит, если одно из обещаний выбросит. Если вы хотите продолжить, даже если одно обещание не выполняется, вы не хотите повторно использовать его, как в приведенном выше коде.
вы можете повторно добавить его в очередь ожидания и повторить попытку.
Кроме того, я могу рассмотреть возможность его пакетной обработки. разделите их на куски и загрузите.
пример:
создать пул рабочих (количество работ = количество ядер процессора (по умолчанию))
запустить загрузку logi c с рабочим пулом
имитировать ошибку / повторить попытку с помощью Math.random
process.js
файла
const path = require('path')
const _ = require('lodash')
const Pool = require('piscina')
const BB = require('bluebird')
const workerPool = new Pool({
filename: path.resolve(__dirname, 'worker.js'),
})
const generateData = (numItems = 5) => {
return Array.from({ length: numItems }, (v, idx) => 'item ' + idx)
}
const CHUNK_SIZE = 10
const data = generateData(100)
const chunks = _.chunk(data, CHUNK_SIZE)
BB.map(
chunks,
(chunk) => {
workerPool.runTask(chunk)
},
{ concurrency: 1 /* 1 chunk at a time */ }
)
worker.js
файла
const retry = require('p-retry')
// your upload logic here
function process(data) {
if (Math.random() > 0.5) {
console.log('processing ', data)
} else {
console.log('fail => retry ', data)
throw new Error('process failed' + data)
}
}
module.exports = (data) => {
return retry(() => process(data), { retries: 10 })
}
запустить с node process.js