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