Node.js 如何在for循环中实现异步?
我有一个名为“alldetails”的集合,其中包含一些集合的详细信息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
{
"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);
}
});