Javascript nodeJS中的循环问题

Javascript nodeJS中的循环问题,javascript,node.js,Javascript,Node.js,我在nodeJS中有一个循环,需要处理sequelize查询的结果。 我认为必须使用promise或other,因为代码只针对最后一条记录执行 代码是: pages.forEach(函数(第页){ findOne({属性:['html','template','permalink'], 其中:{id:page.id})。然后(obj=>{ html=obj.html; permalink=obj.permalink; 模板=obj.template; var变量=[]; console.log(

我在nodeJS中有一个循环,需要处理sequelize查询的结果。 我认为必须使用promise或other,因为代码只针对最后一条记录执行

代码是:

pages.forEach(函数(第页){
findOne({属性:['html','template','permalink'],
其中:{id:page.id})。然后(obj=>{
html=obj.html;
permalink=obj.permalink;
模板=obj.template;
var变量=[];
console.log(“PERMALINK”,PERMALINK);//以下代码仅对最后一条记录运行
db.PageVariable.findAll({
属性:['variable\u name','variable\u value'],
raw:是的,
其中:{id_page:page.id}
}).然后(功能(项目){
console.log(“--------------”;
//.......
}).catch(函数(err){
控制台日志(err);
});
});
});

如何修改循环以使其正常工作?

您可以使用wait(仅适用于async功能)等待承诺解决或拒绝,请参阅更多:

您可以按如下方式使用它:

async function doStuff(page) {

  let result = await //your db calls

  // "done!"
}

for (page of pages) {     
    // Do something
   await doStuff(page);
  }
注意:

  • 仅在空间/必要情况下使用async/await循环
  • 如果您想按顺序执行某些操作,那么实际上不能使用forEach。只需使用一个现代的for…of循环,在这个循环中,wait将按预期工作
  • 如果不需要按顺序运行任务,则使用内置实用程序Promise.all()并行运行任务
  • 请参见下面的示例promise.all()如何工作:

    const tasks   = asyncThingsToDo.map(runTask); // Run all tasks in parallel.
    const results = await Promise.all(tasks);     // Gather up the results.
    results.forEach(x => console.log(x));         // Print them out on the console.
    

    尝试将
    页面
    处理放在一个返回承诺的函数中,如下所示:

    const getPagePromise=page=>
    db.Page.findOne({
    属性:['html','template','permalink'],
    其中:{
    id:page.id
    }
    }).然后(obj=>{
    html=obj.html;
    permalink=obj.permalink;
    模板=obj.template;
    var变量=[];
    console.log(“PERMALINK”,PERMALINK);//以下代码仅对最后一条记录运行
    返回db.PageVariable.findAll({
    属性:['variable_name','variable_value'],
    raw:是的,
    其中:{
    id\u页面:page.id
    }
    }).然后(功能(项目){
    console.log(“--------------”;
    //.......
    }).catch(函数(err){
    控制台日志(err);
    });
    });
    });
    
    然后
    map
    将您的
    页面
    数组映射到一个承诺数组(如前面定义的承诺),如下所示:

    const allPagesPromises=pages.map(getPagePromise);
    
    最后,使用
    Promise.all
    来解决/拒绝所有承诺

    Promise.all(所有页面推荐)
    .then(allResults=>{//Do stuff})
    .catch(err=>{//Handle errors});
    

    考虑避免过多的回调嵌套,比如在处理页面时。相反,将逻辑拆分为返回承诺的小函数,这将使事情更易于阅读/调试。

    期望的结果或输出是什么?缺少太多代码,无法查看您试图通过循环完成的任务。我需要对所有记录执行代码,而不是仅对所有记录执行最后一个。无论您试图做什么来累积结果,都只是在累积一个结果,所以您必须向我们展示代码。现在,这个问题是无法回答的,因为没有足够的信息说明您试图实现的结果。这并不是回答问题,只是说明async await是如何工作的。更不用说你在一个循环中使用wait,这是一个很大的禁忌…@DanStarns,谢谢你的更正。实际上,它是现代的。。其中的将按预期工作(编辑相同)。不,这仍然无效,您应该使用