Nodejs MongoDb 异步回调
Nodejs MongoDb Asynchronous Callback
我刚刚开始使用 NodeJs 并处理异步函数。
我尝试从 for 循环中执行多个 MongoDB 调用,我需要等待所有调用完成才能进行下一步。
我尝试使用异步来实现它,但似乎无法访问调用之外的所有变量。知道如何让它发挥作用吗?
var sample = req.body; // sample will be an array list of items
var stringList = "";
var calls = [];
for(var i = 0; i < sample.length; i++) {
console.log(sample[].item) // i can print it here
calls.push(function(callback) {
db3.table.find({column1:sample[i].item}, function(err, temp){ // i hit an error here, it cannot find sample[i].item...
if (err)
return callback(err);
stringList = stringList + temp[0].item2;
callback(null, stringList );
});
});
}
async.parallel(calls, function(err, result) {
if (err)
return console.log(err);
console.log(result); // I am expecting a string of all the item2 returned and concatenated previously
});
异步并行回调无论如何都会将数据发送到最终回调,您可以使用此功能合并所有发送的值。
var sample = req.body; // sample will be an array list of items
var stringList = "";
var calls = [];
for (var i = 0; i < sample.length; i++) {
console.log(sample[i].item) // i can print it here
calls.push(function (callback) {
db3.table.find({column1: sample[i].item}, function (err, temp) {
// i hit an error here, it cannot find sample[i].item...
if (err) {
return callback(err);
}
callback(null, temp[0].item2);
});
});
}
async.parallel(calls, function (err, result) {
if (err) {
return console.log(err);
}
stringList = result.join('');
console.log(stringList); // I am expecting a string of all the item2 returned and concatenated previously
});
也许您可以检查所有数据库查询何时完成:
var sample = req.body; // sample will be an array list of items
var stringList = "";
var counter = 0;
for(var i = 0; i < sample.length; i++) {
console.log(sample[].item) // i can print it here
db3.table.find({column1:sample[i].item}, function(err, temp){ // i hit an error here, it cannot find sample[i].item...
if (err)
throw err;
stringList = stringList + temp[0].item2;
if(++counter >= sample.length) {
// when here you will have the whole string
console.log(stringList);
}
});
});
}
每个异步操作都可以用回调或承诺来表达。这里有两个例子可能会有帮助
// sequential execution P.S. use for dependent tasks
var operations= [1,2,3];
(function loop(index){
if(index==operations.length) return ;
setTimeout(function() {
console.log(`hello ${operations[index]}`);
loop(++index);
}, 1000);
})(0)
// parallel execution P.S. use when independent tasks
Promise.all(operations.map(val=>{
return new Promise((resolve, reject) => {
console.log(`hello ${val}`);
});
}))
.then(data=>{
})
.catch(err=>{
console.log(err);
})
阅读更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
我刚刚开始使用 NodeJs 并处理异步函数。 我尝试从 for 循环中执行多个 MongoDB 调用,我需要等待所有调用完成才能进行下一步。
我尝试使用异步来实现它,但似乎无法访问调用之外的所有变量。知道如何让它发挥作用吗?
var sample = req.body; // sample will be an array list of items
var stringList = "";
var calls = [];
for(var i = 0; i < sample.length; i++) {
console.log(sample[].item) // i can print it here
calls.push(function(callback) {
db3.table.find({column1:sample[i].item}, function(err, temp){ // i hit an error here, it cannot find sample[i].item...
if (err)
return callback(err);
stringList = stringList + temp[0].item2;
callback(null, stringList );
});
});
}
async.parallel(calls, function(err, result) {
if (err)
return console.log(err);
console.log(result); // I am expecting a string of all the item2 returned and concatenated previously
});
异步并行回调无论如何都会将数据发送到最终回调,您可以使用此功能合并所有发送的值。
var sample = req.body; // sample will be an array list of items
var stringList = "";
var calls = [];
for (var i = 0; i < sample.length; i++) {
console.log(sample[i].item) // i can print it here
calls.push(function (callback) {
db3.table.find({column1: sample[i].item}, function (err, temp) {
// i hit an error here, it cannot find sample[i].item...
if (err) {
return callback(err);
}
callback(null, temp[0].item2);
});
});
}
async.parallel(calls, function (err, result) {
if (err) {
return console.log(err);
}
stringList = result.join('');
console.log(stringList); // I am expecting a string of all the item2 returned and concatenated previously
});
也许您可以检查所有数据库查询何时完成:
var sample = req.body; // sample will be an array list of items
var stringList = "";
var counter = 0;
for(var i = 0; i < sample.length; i++) {
console.log(sample[].item) // i can print it here
db3.table.find({column1:sample[i].item}, function(err, temp){ // i hit an error here, it cannot find sample[i].item...
if (err)
throw err;
stringList = stringList + temp[0].item2;
if(++counter >= sample.length) {
// when here you will have the whole string
console.log(stringList);
}
});
});
}
每个异步操作都可以用回调或承诺来表达。这里有两个例子可能会有帮助
// sequential execution P.S. use for dependent tasks
var operations= [1,2,3];
(function loop(index){
if(index==operations.length) return ;
setTimeout(function() {
console.log(`hello ${operations[index]}`);
loop(++index);
}, 1000);
})(0)
// parallel execution P.S. use when independent tasks
Promise.all(operations.map(val=>{
return new Promise((resolve, reject) => {
console.log(`hello ${val}`);
});
}))
.then(data=>{
})
.catch(err=>{
console.log(err);
})
阅读更多https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise