使用parse.com javascript SDK丢失上下文

时间:2014-03-10 21:41:50

标签: javascript parse-platform scope

所以我正在做的目标是在对象文字中存储一个对象数组供以后参考。我在一个令我感到困惑的地方丢失了上下文(如果这是在这里使用的正确术语)。这是代码:

HuntObject = {

        // Data.hunts gives collection
        Data: {},

        fetchCollec: function(){
            var self = this;

            var huntObj = new Parse.Query(huntObject);
            huntObj.find({
                success: function(results){
                    var hunts = [];

                    for(i in results){
                        hunts.push(i);
                    }
                    console.log(self);
                            //Here self references HuntObject
                    self.Data = hunts;



                },

                error: function(e){
                    console.log(e.message);
                }
            });

            console.log(self);// Here self references HuntObject 
                            console.log(self.Data); // empty

因此,在我的console.log语句中,引用了我想要的正确上下文,并且在对self的最后一次日志调用中,我甚至可以在控制台中看到Data对象现在有一个对象数组。但是,一旦我尝试引用该数组,我就会得到一个空对象。我尝试以不同的方式分配数组,如self.Data.array = hunts。我还尝试将Data设置为这样的方法。

Data: (function(){
        return {
            array: []
        }
     }());

我想也许我对不同情况下上下文变化的理解非常微弱所以解决我原来的目标会很好但更重要的是我想更好地理解上下文以及为什么我的实现在这种情况下失败了?

1 个答案:

答案 0 :(得分:1)

这不是范围或上下文问题,您使用self变量处理该问题。

我的猜测是Parse.Query 异步。因此,您必须在成功函数中执行console.log ;在调用Parse.Query之后立即在代码中执行此操作过早调用(在查询完成之前)。

所以:

huntObj.find({
    success: function (results) {
        var hunts = [];

        for (i in results) {
            hunts.push(i);
        }
        console.log(self);
        //Here self references HuntObject
        self.Data = hunts;

        // *********** Move these here
        console.log(self); // Here self references HuntObje
        console.log(self.Data); // Not empty anymore
    },

    error: function (e) {
        console.log(e.message);
    }
});

// Any code here runs after you've *started* the query, but
// before it *completes*