javascript - Parse.com 云代码 - 无法弄清楚为什么 javascript 变量在所有数组项中具有相同的值

标签 javascript ios parse-platform cloud

我有以下云代码获取一些记录,然后将它们与相应的日期一起添加到一个数组中,但数组似乎总是具有相同的日期,即该范围内的最后一个日期。

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/

相关文章:

ios - 当前的 Parse 电子邮件验证正则表达式模式是什么?

javascript - jQuery/JavaScript - 将变量传递给函数

ios - Unity 性能峰值达到 30 FPS

ios - 应用剪切路径后,如何确定点是否位于路径内部?

javascript - Parse.com JavaScript SDK - 如何刷新缓存的用户对象?

ios - 不能对 PFObject 上的键或值使用 nil。使用 NSNull 作为值

javascript - 我怎样才能让我的汉堡包菜单更小,并且周围有一个完美的圆形边框?

javascript - 检查哪些数组元素具有空值

javascript - 如何指出 div 停止随浏览器大小缩小的位置

ios - 从 nsurlconnection 委托(delegate)方法返回响应数据