微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-在node.js中一次迭代以50个项目为块的数组

我是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 举报,一经查实,本站将立刻删除。

相关推荐