我一直在尝试理解 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 值:即 - 没有关闭)。
我希望这很清楚。如果没有,请告诉我。任何帮助表示赞赏。