我有以下云代码获取一些记录,然后将它们与相应的日期一起添加到一个数组中,但数组似乎总是具有相同的日期,即该范围内的最后一个日期。
Parse.Cloud.define("getJournalEntryWeekly", function(request, response) {
var currDate =new Date( request.params.currDate);
var user = request.params.user;
var avgArray = [];
var success = false;
var counter = 0;
var day=0;
var d1;
var d2;
for(i = 0;i < 7; i++)
{
d1 = new Date(currDate.getTime() + 1000 * 60 * 60 * 24 * (i+1));
d2 = new Date(currDate.getTime() + 1000 * 60 * 60 * 24 * (i));
var query = new Parse.Query("JournalEntry");
query.greaterThan("createdAt",d2);
query.lessThan("createdAt",d1);
query.equalTo("userName",user);
query.find({
success: function(results) {
counter++;
var avg=0;
var level = 0;
var total = results.length;
for(j = 0; j < results.length ; j++)
{
var entry = results[j];
level += entry.get("happinessLevel");
//avgArray.push(entry.get("happinessLevel"));
}
if(results.length != 0)
{
avg = level/total;
}
day++;
avgArray.push({day:d1,avg:avg});
if(counter == 7)
{
response.success(avgArray);
}
},
error: function() {
counter++;
//response.error("no entry found");
}
});
}
});
输出如下
{"result":[{"day":{"__type":"Date","iso":"2014-07-27T00:00:00.000Z"},"avg":63},{"day":{"__type":"Date","iso":"2014-07-27T00:00:00.000Z"},"avg":0},{"day":{"__type":"Date","iso":"2014-07-27T00:00:00.000Z"},"avg":0},{"day":{"__type":"Date","iso":"2014-07-27T00:00:00.000Z"},"avg":0},{"day":{"__type":"Date","iso":"2014-07-27T00:00:00.000Z"},"avg":0},{"day":{"__type":"Date","iso":"2014-07-27T00:00:00.000Z"},"avg":0},{"day":{"__type":"Date","iso":"2014-07-27T00:00:00.000Z"},"avg":0}]}
我添加到响应数组的日期变量 d1 始终是它的最后一个值,实际上应该随着从开始日期到结束日期添加的每个数组项而改变。
最佳答案
过度简化:
当您调用 avgArray.push({day:d1,avg:avg});
时,您处于先前调用 find()
的异步运行完成回调中>。这在您对 find()
(在您的循环中)的所有调用都已完成之后运行。所以,此时d1
就是上次循环的值。
准确描述:javascript closures and value capture .
该链接显示了一个很好的解决方案,即使用一个函数来捕获闭包内的值。我不能说我已经在您的具体示例中尝试过了,这是一个复杂的问题,但它应该为您指明了正确的方向。
关于javascript - Parse.com 云代码 - 无法弄清楚为什么 javascript 变量在所有数组项中具有相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24866249/