Node.js 如何在for循环中实现异步?

Node.js 如何在for循环中实现异步?,node.js,promise,async-await,Node.js,Promise,Async Await,我有一个名为“alldetails”的集合,其中包含一些集合的详细信息 { "name" : "Test1", "table_name" : "collection1", "column_name" : "column1" }, { "name" : "Test2", "table_name" : "collection2", "column_name" : "column2" }, { "name" : "Test3", "tab

我有一个名为“alldetails”的集合,其中包含一些集合的详细信息

{
    "name" : "Test1",
    "table_name" : "collection1",
    "column_name" : "column1"
},
{
    "name" : "Test2",
    "table_name" : "collection2",
    "column_name" : "column2"
},
{
    "name" : "Test3",
    "table_name" : "collection3",
    "column_name" : "column3"
}
我有collection1、collection2和collection3,它们分别有column1、column2和Column3

我必须从'alldetails'中获取所有名称,并且必须根据列名获取其他表的最小值和最大值

所以我希望输出如下

{name: ["Test1","Test2","Test3"],
date: [{min_date: "2018-12-01", max_date: "2018-12-31", name: "Test1"},
              {min_date: "2018-12-01", max_date: "2018-12-31", name: "Test2"},
              {min_date: "2018-12-01", max_date: "2018-12-31", name: "Test3"}]

}
我尝试了下面的代码,因为它没有阻塞,也没有等待响应

alldetails.find({}, { _id: 0 }).then(async function(result) { 
    let result_data = {};  
    let resolvedFinalArray = {};
    let array = [];
    result_data["name"]= [];
    result_data["date"] = [];
    resolvedFinalArray = await Promise.all(result.map(async value => { 
      result_data["name"].push(value.name)  
      getResult(value.table_name,value.column_name,function(response){
           result_data["date"].push({min_date: response.minvalue, max_date: response.maxvalue, name:value.name})          
       });     
    }));
    setTimeout(function()
    { 
      console.log(resolvedFinalArray);
    }, 3000);

});

请给我一个解决方案

如果要在数组的所有元素上应用异步函数,请使用async.eachOfLimit:

var async = require("async");
var array = [{_id: "...."},{...},{...}];

async.eachOfLimit(array, 1, function(element, index, cb){


    myAsyncFunctionWithMyElement(element, function(err){
        return cb(err);
    });

}, function(err){
  // final callback
});
数组forEach方法(除非你做了像重新定义原型这样非常邪恶的事情)。对内部结构有很好的洞察力

如果您不想依赖外部库,一种简单(也是我最喜欢的)方法是:

    for (let i = 0; i < <your array>.length; i++ ) {
        await Promise.all( <your logic> );
    }

for(设i=0;i<.length;i++){
等待承诺;
}

只需根据您的需要进行调整即可!:)

您可能希望使用
来等待
循环。有关详细信息,请参阅


IMHO是最现代的方法,它不需要加载任何外部依赖项,因为它内置于语言本身。它基本上与经典的for of循环非常相似。

如果要等待
getResult
,则需要从
result.map
回调返回
Promise

您没有将任何内容推送到
resolvedFinalArray
,那么为什么还要麻烦使用
console.log(resolvedFinalArray)

或对循环使用

alldetails.find({}, {_id: 0}).then(async (result) => {
    let result_data = {};
    result_data["name"] = [];
    result_data["date"] = [];
    for (let i = 0; i < result.length; i++) {
        const value = result[i];
        await new Promise((resolve) => {
            getResult(value.table_name, value.column_name, (response) => {
                result_data["name"].push(value.name);
                result_data["date"].push({
                    min_date: response.minvalue,
                    max_date: response.maxvalue,
                    name: value.name
                });
                resolve();
            });
        });
    }
    console.log(result_data);
});
alldetails.find({},{u id:0})。然后(异步(结果)=>{
让结果_data={};
结果_数据[“名称”]=[];
结果数据[“日期”]=[];
for(设i=0;i{
getResult(value.table\u name,value.column\u name,(响应)=>{
结果_数据[“名称”].push(value.name);
结果_数据[“日期”]。推送({
最小日期:response.minvalue,
最大日期:response.maxvalue,
名称:value.name
});
解决();
});
});
}
控制台日志(结果数据);
});

如果考虑到所有词法范围,这应该是可行的。这也是一个更好的选择,它会减少,如果其他块和管理承诺为您

alldetails.find({}, { _id: 0 })
    .exec((err, result) => {
        if (!err) {
            let resolvedFinalArray = [];
            result.map((value) => {
                resolvedFinalArray.push({
                    name: value.name,
                    date: []
                });
                getResult(value.table_name, value.column_name, (err, response) => {
                    if (!err) {
                        resolvedFinalArray[resolvedFinalArray.indexOf(value.name)]['date'].push({
                            min_date: response.minvalue, 
                            max_date: response.maxvalue, 
                            name:value.name
                        });
                    } else {
                        // Send your error messsage.
                        // res.status(500).send(err);            
                    }
                });
            });
            console.log(resolvedFinalArray);
            // res.send(resolvedFinalArray);
        } else {
            // Send your error messsage.
            // res.status(500).send(err);
        }
    });

可能是重复的我也试过了。我已经更新了我的问题
alldetails.find({}, { _id: 0 })
    .exec((err, result) => {
        if (!err) {
            let resolvedFinalArray = [];
            result.map((value) => {
                resolvedFinalArray.push({
                    name: value.name,
                    date: []
                });
                getResult(value.table_name, value.column_name, (err, response) => {
                    if (!err) {
                        resolvedFinalArray[resolvedFinalArray.indexOf(value.name)]['date'].push({
                            min_date: response.minvalue, 
                            max_date: response.maxvalue, 
                            name:value.name
                        });
                    } else {
                        // Send your error messsage.
                        // res.status(500).send(err);            
                    }
                });
            });
            console.log(resolvedFinalArray);
            // res.send(resolvedFinalArray);
        } else {
            // Send your error messsage.
            // res.status(500).send(err);
        }
    });