Javascript 什么';这是NodeJS的最佳设计方法&;循环?

Javascript 什么';这是NodeJS的最佳设计方法&;循环?,javascript,node.js,asynchronous,promise,async-await,Javascript,Node.js,Asynchronous,Promise,Async Await,我有一个PHP脚本,它执行循环(数千次)。每个循环请求一个分页URL,该URL以JSON格式返回一些结果。每个结果需要至少2次进一步的API点击以请求更多信息。一旦所有这些都完成了,我会将其构建到一个用于索引/存储的数据包中 在PHP中,这非常简单,因为它是自然同步的 我正在将其移动到NodeJS设置中,并发现很难在NodeJS中优雅地完成此操作 如果我做一个for循环,初始HTTP请求(通常是基于承诺的)几乎会立即完成,将请求的解析留给承诺处理程序。这意味着所有数千个页面请求最终都将几乎并行地

我有一个PHP脚本,它执行循环(数千次)。每个循环请求一个分页URL,该URL以JSON格式返回一些结果。每个结果需要至少2次进一步的API点击以请求更多信息。一旦所有这些都完成了,我会将其构建到一个用于索引/存储的数据包中

在PHP中,这非常简单,因为它是自然同步的

我正在将其移动到NodeJS设置中,并发现很难在NodeJS中优雅地完成此操作

如果我做一个for循环,初始HTTP请求(通常是基于承诺的)几乎会立即完成,将请求的解析留给承诺处理程序。这意味着所有数千个页面请求最终都将几乎并行地被触发。这也意味着我必须在promise解析中链接子请求(这会导致进一步的promise链,因为我必须等待这些请求被解析)

我尝试过使用async/await方法,但它们似乎不能很好地处理for循环(或者至少是forEach)

这大概就是我现在正在使用的,但我开始认为它完全错了,我可能正在使用回调来触发下一个循环

async processResult(result) {
  const packet = {
    id: result.id,
    title: result.title,
  };

  const subResponse1 = await getSubThing1();
  packet.thing1 = subResponse1.body.thing1;

  const subResponse2 = await getSubThing2();
  packet.thing2 = subResponse2.body.thing2;
}

(async () => {
  for (let page = START_PAGE; page < MAX_PAGES; page += 1) {
    console.log(`Processing page ${page}...`);
    getList(page)
      .then(response => Promise.all(response.body.list.map(processResult)))
      .then(data => console.log('DATA DONE', data));
    console.log(`Page ${page} done!`);
  }
})();
async processResult(结果){
常量数据包={
id:result.id,
标题:result.title,
};
const subResponse1=等待getSubThing1();
packet.thing1=子响应1.body.thing1;
const subResponse2=等待getSubThing2();
packet.thing2=子响应2.body.thing2;
}
(异步()=>{
对于(让页面=开始页面;页面<最大页面;页面+=1){
log(`Processing page${page}…`);
获取列表(第页)
.then(response=>Promise.all(response.body.list.map(processResult)))
.then(data=>console.log('datadone',data));
log(`Page${Page}完成!`);
}
})();
我尝试过使用async/await方法,但它们似乎不能很好地处理for循环(或者至少是forEach)

是的,但是在正常的
for
循环中放入
wait
就可以了:

(async () => {
  for (let page = START_PAGE; page < MAX_PAGES; page += 1) {
    console.log(`Processing page ${page}...`);
    const response = await getList(page);
    const data = await Promise.all(response.body.list.map(processResult));
    console.log('DATA DONE', data);
    console.log(`Page ${page} done!`);
  }
})();
(异步()=>{
对于(让页面=开始页面;页面<最大页面;页面+=1){
log(`Processing page${page}…`);
常量响应=等待获取列表(第页);
const data=wait Promise.all(response.body.list.map(processResult));
console.log(“数据完成”,数据);
log(`Page${Page}完成!`);
}
})();