gpt4 book ai didi

javascript - 如何将变量的当前值发送到异步回调

转载 作者:行者123 更新时间:2023-11-30 12:45:27 25 4
gpt4 key购买 nike

我和this question有同样的问题但无法解决问题。我正在尝试编写一个 nodejs 脚本,该脚本将首先检查 mongo 中的缓存值,但如果它不存在,则关闭并计算它。问题是 findOne() 回调没有得到循环变量的原始值,因此回调无法正确计算和存储该值。 (我省略了实际的获取、存储和返回以专注于我遇到的实际问题)。无论我做什么,我都无法将原始值输入回调。

for (var d=start_date; d<now; d.setHours(d.getHours()+1)) {
(function(key) {
console.log('caller='+key)

db.collection('avgs').findOne( { date: key.toISOString() },function (err,data) {
console.log('callback='+key);
if (data) { //return data }
else { // compute average for given date , insert into database and return value }
});
})(d);
};

控制台日志显示了这一点

caller=Tue Mar 25 2014 00:00:00 GMT+1030 (CST)
caller=Tue Mar 25 2014 01:00:00 GMT+1030 (CST)
caller=Tue Mar 25 2014 02:00:00 GMT+1030 (CST)
caller=Tue Mar 25 2014 03:00:00 GMT+1030 (CST)
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST)
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST)
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST)
callback=Wed Mar 26 2014 14:00:00 GMT+1030 (CST)

最佳答案

我猜你的问题是你将值 d 发送到包装函数,并在该函数内部以某种方式修改该值。由于 d 是对您的循环迭代器的引用,因此修改它会修改您的循环。解决方案是在您的函数内创建对象的副本:

    for (var d=start_date; d<now; d.setHours(d.getHours()+1)) {
(function(_key) {
// Make a copy of the object you passed in, so that modifying it
// won't screw up your loop
var key = new Date(_key);
console.log('caller='+key)

db.collection('avgs').findOne( { date: key.toISOString() },function (err,data) {
console.log('callback='+key);
if (data) { //return data }
else { // compute average for given date , insert into database and return value }
});
})(d);
};

关于javascript - 如何将变量的当前值发送到异步回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22651086/

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