gpt4 book ai didi

node.js - 使用node.js异步系列,但不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:03 27 4
gpt4 key购买 nike

我想使用异步让node.js按顺序工作,首先从mongodb查询两个费率,然后使用这些费率计算两个新费率:

async.series([
function(callback){
db.collection('heros',function(err,collection){
if(err){
console.log(err);
}
if(!err){
console.log("2 collection fetched!");
collection.findOne({'id':win},function(err,result){
if (err) throw err;
rate1=result.rate;
console.log("win-rate:"+rate1);
});
collection.findOne({'id':lose},function(err,result){
if (err) throw err;
rate2=result.rate;
console.log("lose-rate:"+rate2);
});
}
});
callback(null);

}, function(callback){
var Ea= 1/(1+Math.pow(10,(rate2-rate1)/400));
var Eb= 1/(1+Math.pow(10,(rate1-rate2)/400));
var ra= rate1+16*(1-Ea);
var rb= rate2+16*(0-Eb);
console.log("ra:"+ra);
console.log("rb:"+rb);
callback(null);
},
function(callback){
db.collection('heros',function(err,collection){
if(!err){
collection.update({'id':win},{$set: {rate:ra}},function(err,result){
if(err) throw err;
if(!err){
console.log("update successful");
}
});
collection.update({'id':lose},{$set:{rate:rb}},function(err,result){
if(err) throw err;
if(!err){
console.log("update successful");
}
});

}

});
callback(null);
}
]);

但是当我运行它时,它显示错误消息:

ReferenceError: ra is not defined

看来nodejs没有等待查询完成就跳转到计算或更新。

最佳答案

您在函数 block 内声明诸如 ra 之类的变量,因此它们的作用域仅限于该函数并且在其他地方不可用。您需要将它们放在更容易访问的地方。例如,您可以将它们放入全局变量中:

var ra;

async.series([ ... ]);

此外,当您使用系列时,您应该仅在该步骤的所有工作完成后才调用回调函数。

例如,一项任务应如下所示:

db.collection('heros',function(err,collection){
if(err){
console.log(err); // log the error
callback(err); // call the async call back with the error
return; // stop
}
console.log("2 collection fetched!");
collection.findOne({'id':win},function(err,result){
if (err) { callback(err); return; } // again, handle error
rate1 = result.rate; // grab results
console.log("win-rate:"+rate1); // log
callback(null, rate1); // now indicate complete by calling
});
});

由于您在单个任务中调用了多个异步函数,因此您可能希望将它们拆分为多个任务,或者考虑使用并行函数。您甚至可以在series 调用中的其他任务之一中使用parallel 来处理需要进行两个findOne 调用的情况。

关于node.js - 使用node.js异步系列,但不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18476966/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com