最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

在Node.js上处理昂贵的任务(嵌套循环)

运维笔记admin12浏览0评论

在Node.js上处理昂贵的任务(嵌套循环)

在Node.js上处理昂贵的任务(嵌套循环)

首先我写总结的伪代码。

const ExcelSheet = new ExcelSheet() // excel.js library

const usersWithPlayedGames  = await findAllUsers({ include: GameTable });

for (let i = 0; i < usersWithPlayedGames.length; i++) {
    // Write some user data on Excel.
    ...
    ...
    for (let j = 0; j < usersWithPlayedGames[i].length; j++) {
        // Write some user's game on Excel
        ...
        ...
        for (let k = 0; k < usersWithPlayedGames[i][j].length; k++) {
            // Write some users's game's company data on Excel
            ...
            ...
        }
    }
}

res.send(ExcelSheet.toFile());

实际代码很长。

并且需要客户端请求=> res时间将近15秒。

我知道我的问题解决方法不好。

我可以使用此代码进行重构。

但是真正的问题是它阻止了另一个客户端请求。

我在Google上搜索并找到了几种解决方案。

  1. Node.js子进程生成。
  2. 使用回调函数(我不知道该怎么做)。
  3. 写得比一个好的算法还多。

Node.js中缺少什么概念?

请帮我一点忙。

谢谢。

回答如下:

您可能最好在子进程或Web请求线程之外的其他地方运行此命令,但是,如果不能这样做,则可以使用setImmediate之类的方法来分解任务>

const ExcelSheet = new ExcelSheet() // excel.js library

const usersWithPlayedGames  = await findAllUsers({ include: GameTable });

const excelLoop = (index) => {

  for (let j = 0; j < usersWithPlayedGames[index].length; j++) {
      // Write some user's game on Excel
      ...
      ...
      for (let k = 0; k < usersWithPlayedGames[index][j].length; k++) {
          // Write some users's game's company data on Excel
          ...
          ...
      }
  }

  if (index < usersWithPlayedGames.length) {
    setImmediate(() => excelLoop(index + 1))
  }
  else {
    res.send(ExcelSheet.toFile());
  }
};

excelLoop(0);

Documentation for setImmediate

发布评论

评论列表(0)

  1. 暂无评论