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

Posted

技术标签:

【中文标题】Parse.com 云代码 - 无法弄清楚为啥 javascript 变量在所有数组项中具有相同的值【英文标题】:Parse.com cloud code- Cant figure out why javascript variable has same value in all array itemsParse.com 云代码 - 无法弄清楚为什么 javascript 变量在所有数组项中具有相同的值 【发布时间】:2014-07-21 13:25:14 【问题描述】:

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

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 始终为其最后一个值,实际上应该随着从开始日期到结束日期添加的每个数组项而改变。

【问题讨论】:

【参考方案1】:

过于简单化:

当您调用avgArray.push(day:d1,avg:avg); 时,您将处于先前调用find() 的异步运行完成回调中。这将在您对find()(在您的循环中)进行所有调用之后运行。所以,此时d1就有了最后一个循环的值。

准确描述:javascript closures and value capture。

该链接显示了一个很好的解决方案,即使用一个函数来捕获闭包内的值。我不能说我已经在您的具体示例中尝试过,这是一个复杂的问题,但它应该为您指明正确的方向。

【讨论】:

感谢那篇文章解释它将尝试解决方案希望它对我有所帮助。

以上是关于Parse.com 云代码 - 无法弄清楚为啥 javascript 变量在所有数组项中具有相同的值的主要内容,如果未能解决你的问题,请参考以下文章

使用 mypy 进行类型检查,我无法弄清楚为啥会发生此错误 [关闭]

无法弄清楚为啥我在我的 jsonp 序列化中得到重复数据

已经坐了一个小时,无法弄清楚为啥找不到 /js/bootstrap.min.js

我无法弄清楚为啥我的数组列表没有使用我所说的新值进行更新

无法弄清楚为啥触发器无效?

无法弄清楚为啥我的字符、字数和行数适用于文件输入,但不适用于标准输入