-1

我有一个名为“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,colum3

我必须从“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);

});

请建议我一个解决方案。

4

5 回答 5

1

如果你想等待,getResult那么你需要Promiseresult.map回调中返回。

你没有推动任何事情,resolvedFinalArray所以为什么要打扰console.log(resolvedFinalArray)

alldetails.find({}, {_id: 0}).then(async (result) => {
    let result_data = {};
    result_data["name"] = [];
    result_data["date"] = [];
    await Promise.all(result.map(value => {
        // create Promise that resolves where getResult callback is fired
        return 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);
});

或使用for循环

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);
});
于 2019-04-11T11:22:17.677 回答
0

数组 forEach 方法不适用于 async 函数(除非你做了非常邪恶的事情,比如重新定义原型)。这个问题对内部有很好的洞察力。

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

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

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

于 2019-04-11T11:10:22.217 回答
0

您可能想使用for await of循环。有关详细信息,请参阅此博客文章

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

于 2019-04-11T11:12:32.520 回答
0

如果考虑到所有词法范围,这应该可行。异步每个也是更好的选择,如果 else 阻塞和管理你的承诺,它会减少。

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);
        }
    });
于 2019-04-11T11:25:30.413 回答
0

如果要对数组的所有元素应用异步函数,请使用 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
});
于 2019-04-11T10:55:18.353 回答