您应该首先将数组分成 50 个块。然后您需要一个一个地发出请求,而不是一次发出请求。 Promise 可以用于此目的。
考虑这个实现:
function parseData() { } // returns an array of 1000 items
async function uploadData(dataArray) {
try {
const chunks = chunkArray(dataArray, 50);
for(const chunk of chunks) {
await uploadDataChunk(chunk);
}
} catch(error) {
// Catch an error here
}
}
function uploadDataChunk(chunk) {
// return a promise of chunk uploading result
}
const dataArray = parseData();
uploadData(dataArray);
使用 async/await 将在幕后使用 Promise,这样await
将等到当前块上传,然后才会上传下一个(如果没有发生错误)。
这是我对 chunkArray 函数实现的建议:
function chunkArray(array, chunkSize) {
return Array.from(
{ length: Math.ceil(array.length / chunkSize) },
(_, index) => array.slice(index * chunkSize, (index + 1) * chunkSize)
);
}
注意:此代码使用 ES6 功能,因此最好使用 babel / TypeScript。
Update
如果您创建多个异步数据库连接,只需使用一些数据库池工具即可。
Update 2
如果你想异步更新所有的 chunk,并且当 chunk 上传后开始上传另一个 chunk,你可以这样做:
function uploadDataChunk(chunk) {
return Promise.all(
chunk.map(uploadItemToGoogleCloud) // uploadItemToGoogleCloud should return a promise
);
}