在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上搜索并找到了几种解决方案。
- Node.js子进程生成。
- 使用回调函数(我不知道该怎么做)。
- 写得比一个好的算法还多。
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