1

我一直在尝试理解 Javascript 闭包,并认为我正在做一些事情。我已经成功地在我的内部函数中返回了一个迭代整数(由 for 循环生成)。

然而,这个有问题的函数也需要一个由函数本身生成的参数。请原谅我的术语——但它可能是一个回调参数(基本上,参数的值是根据我发出的函数返回的)。

下面有更多关于我的问题的解释,但首先,这里是有问题的代码(闭包工作 - [value] 是 i 每次迭代的变化值):

FB.api('/me/tagged?limit=100', function(response) {

for (var i=0; i<response.data.length; i++){

    var taggedId = response.data[i].id;
    var fromId = response.data[i].from.id;
    var fromName = response.data[i].from.name;

    var taggedQuery = new Parse.Query('tagged');
    taggedQuery.equalTo('taggedId',taggedId);
    taggedQuery.first({ //.first returns the first match (.find returns all)
        success: (function(value) {
            return function() {
            console.log(response.data[value]);
            }
        })(i),
        error: function(taggedRecError){
            console.log('error: '+taggedRecError.message);
        }
   });
} //for
});

所以基本上,在上面,我正在查询 Facebook 以获取用户的标记帖子。我使用 for 循环遍历每个结果。

然后我使用 Parse.js 来查询我是否为此标记对象保存了记录。

我希望我的代码能够识别我是否这样做(有一个保存的对象)。在 Parse 中,我通常会使用以下内容来执行此操作:

taggedQuery.first({ //.first returns the first match (.find returns all)
        success: function(value) {
                if(value){
                   //do nothing
                 }
                else {
                   //do something - e.g. save to Parse data store
                }

        }
});

因此,如您所见,我使用返回的参数(值)的存在来决定下一步该做什么。

但是,在第一个代码块中,您可以看到,为了使闭包正常工作,我必须将参数 ('(i)') 直接传递给成功函数,以便获得适当的 i 值以在功能。但是,这会扭曲我们从 Parse 获得的结果 - 即返回的对象来自我传入的参数 - 而不是 Parse 根据我的数据存储返回一个

我似乎陷入了困境 22:手动传入参数以成功关闭(但随后丢失 Parse 调用返回的参数),或不传入任何参数以确保 Parse 根据我的数据存储返回正确的响应(但然后在所述函数中具有错误的 i 值:即 - 没有关闭)。

我希望这很清楚。如果没有,请告诉我。任何帮助表示赞赏。

4

2 回答 2

2

你可以用[].forEach它来简化很多:

FB.api('/me/tagged?limit=100', function(response) {
    response.data.forEach(function(value, i) {
        var taggedId = value.id;
        var fromId = value.from.id;
        var fromName = value.from.name;
        var taggedQuery = new Parse.Query('tagged');
        taggedQuery.equalTo('taggedId', taggedId);
        taggedQuery.first({
            success: function(someOtherData) {
                console.log(value, i, someOtherData);
            },
            error: function(taggedRecError) {
                console.log('error: ' + taggedRecError.message);
            }
        });
    });
});
于 2012-07-23T18:51:30.823 回答
0

你走在正确的轨道上,这就是我认为你想用你的success参数做的事情:

taggedQuery.first({ //.first returns the first match (.find returns all)
    success: (function(index) {
        return function(value) {
            //value is what Parse passes
            //index is your preserved index
        };
    }(i))
});
于 2012-07-23T18:54:26.487 回答