Nodejs 脚本在不等待 Mongodb 查询的情况下执行
Nodejs script executing without waiting for Mongodb query
我在 nodejs 文件中有以下部分
client.db('metro4').collection('Station').findOne({"Name": variabled2}, function(err, res2) {
if(err) throw err;
variabled2 = res2._id;
console.log("id2 = ", res2._id);
});
console.log("v= ",variabled2);
myFunc(variabled);
myFunc
函数也有一些 mongodb 查询。
问题出在执行顺序上。
v = undefined
then some of function results (which are obviously wrong)
id2 = 4
then other of functions results
我来自 运行 MySQL 节点内部的查询,即使在长存储过程中也没有这些问题。
现在建议了很多答案'async and await'。所以,我做了 myFunc
async
并尝试了这个
(async function() {
await recur2();
})();
但正如预期的那样,结果几乎相同,因为程序没有等待第一次查询。
此外,我发现 .then()
与 Promises
相似,但当我在上面的查询中使用回调函数时,它们显然不起作用。
提前致谢。
第一个查询正在使用回调,因此它不会等待完成。所以你需要的是 await
第一个查询,或者将 myFunc
放入回调中。
放在回调中
let variabled2;
client.db('metro4').collection('Station').findOne({"Name": variabled2},
function(err, res2) {
if(err) throw err;
variabled2 = res2._id;
console.log("id2 = ", res2._id);
myFunc(variabled);
});
async/await
(async function() {
let variabled2;
const res2 = await client.db('metro4').collection('Station').findOne({"Name": variabled2})
variabled2 = res2._id;
console.log("id2 = ", res2._id);
myFunc(variabled);
})()
我建议使用 async/await
解决方案,因为它更干净。
我在 nodejs 文件中有以下部分
client.db('metro4').collection('Station').findOne({"Name": variabled2}, function(err, res2) {
if(err) throw err;
variabled2 = res2._id;
console.log("id2 = ", res2._id);
});
console.log("v= ",variabled2);
myFunc(variabled);
myFunc
函数也有一些 mongodb 查询。
问题出在执行顺序上。
v = undefined
then some of function results (which are obviously wrong)
id2 = 4
then other of functions results
我来自 运行 MySQL 节点内部的查询,即使在长存储过程中也没有这些问题。
现在建议了很多答案'async and await'。所以,我做了 myFunc
async
并尝试了这个
(async function() {
await recur2();
})();
但正如预期的那样,结果几乎相同,因为程序没有等待第一次查询。
此外,我发现 .then()
与 Promises
相似,但当我在上面的查询中使用回调函数时,它们显然不起作用。
提前致谢。
第一个查询正在使用回调,因此它不会等待完成。所以你需要的是 await
第一个查询,或者将 myFunc
放入回调中。
放在回调中
let variabled2;
client.db('metro4').collection('Station').findOne({"Name": variabled2},
function(err, res2) {
if(err) throw err;
variabled2 = res2._id;
console.log("id2 = ", res2._id);
myFunc(variabled);
});
async/await
(async function() {
let variabled2;
const res2 = await client.db('metro4').collection('Station').findOne({"Name": variabled2})
variabled2 = res2._id;
console.log("id2 = ", res2._id);
myFunc(variabled);
})()
我建议使用 async/await
解决方案,因为它更干净。