我是node.js的新手,目前正在尝试对数组迭代进行编码.我有1000个项目的数组-由于服务器负载的问题,我想一次以50个项目的块为单位进行迭代.
我目前使用如下所示的forEach循环(希望将其转换为上述的块迭代)
//result is the array of 1000 items
result.forEach(function (item) {
//Do some data parsing
//And upload data to server
});
任何帮助将非常感激!
UPDATE(回复)
async function uploadData(dataArray) {
try {
const chunks = chunkArray(dataArray, 50);
for (const chunk of chunks) {
await uploadDataChunk(chunk);
}
} catch (error) {
console.log(error)
// Catch en error here
}
}
function uploadDataChunk(chunk) {
return Promise.all(
chunk.map((item) => {
return new Promise((resolve, reject) => {
//upload code
}
})
})
)
}
解决方法:
您应该首先将数组分成50个块.然后,您需要一个接一个地而不是一次发出请求.诺言可用于此目的.
考虑以下实现:
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 en 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.
更新资料
更新2
如果要异步更新所有块,并且在块上载后开始上载另一个,则可以通过以下方式进行:
function uploadDataChunk(chunk) {
return Promise.all(
chunk.map(uploadItemToGoogleCloud) // uploadItemToGoogleCloud should return a promise
);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。