gpt4 book ai didi

函数接受回调值时的 Javascript 关闭

转载 作者:行者123 更新时间:2023-11-30 18:22:56 26 4
gpt4 key购买 nike

我一直在努力理解 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 获得的结果——即返回的对象来 self 传递的参数——而不是来自 Parse 基于我的数据存储返回的对象

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

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

最佳答案

你可以使用 [].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);
}
});
});
});

关于函数接受回调值时的 Javascript 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11618530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com