函数获取回调值时的Javascript闭包

时间:2012-07-23 18:46:52

标签: javascript facebook-graph-api for-loop closures parameter-passing

我一直在努力理解Javascript闭包,并认为我是在做某件事。我已成功地在我的内部函数中返回一个迭代的整数(由for循环生成)。

但是,此函数还会使用函数本身生成的参数。原谅我的术语 - 但它可能是一个callaback参数(基本上,参数的值是根据我发出的函数返回的。)

下面对我的问题有更多的解释,但首先,这里是有问题的代码(关闭工作 - [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)')直接传递给success函数,以便获得i的适当值在函数内使用。然而,这会扭曲我们从Parse获得的结果 - 即返回的对象来自我传递参数 - 而不是从Parse返回基于我的数据存储的

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

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

2 个答案:

答案 0 :(得分: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);
            }
        });
    });
});

答案 1 :(得分: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))
});