【问题标题】:Javascript inline function call from callback [duplicate]来自回调的Javascript内联函数调用[重复]
【发布时间】:2017-06-09 12:28:18
【问题描述】:

我有一个带有回调的函数,它检查我的服务器上是否存在文件,返回的结果是“true”或“false”。我的问题是我在一个 for 循环中调用这个“DoesFIleExist”函数,并在函数前面计算了“id”。问题是,每当一个函数调用被解析并尝试调用“AddResultToPage”时,它会使用最后一次 for 循环迭代的 id,而它应该使用调用函数时给出的 id。

“DoesFileExist”函数将路径和回调作为参数。

任何帮助都将不胜感激,因为我在网上和这里都看过,但我发现的大多数答案都与按钮和按钮上的事件侦听器有关。

DoesFileExist('/XML/'+id.trim()+'.xml',function(data) {
                        console.log(id.trim()+" "+data);
                        if (data == "true") {
                            (function () {
                                console.log("adding to page - "+id.trim());
                                AddResultToPage(id,false);
                            })();
                        }else{
                           console.log("the file does not exist");
                        }

【问题讨论】:

  • 你需要一个闭包,查一下
  • 你应该把 id 从全局空间中取出,用 var 控制它的作用域并作为参数传递。否则 id 可以是任何东西。 (其他人可以将其更改为数字并破坏一切)

标签: javascript for-loop callback inline


【解决方案1】:

把它放在一个自调用函数中:-

(function(id){
DoesFileExist('/XML/'+id.trim()+'.xml',function(data) {
                    console.log(id.trim()+" "+data);
                    if (data == "true") {
                        (function () {
                            console.log("adding to page - "+id.trim());
                            AddResultToPage(id,false);
                        })();
                    }else{
                       console.log("the file does not exist");
                    }
})}(id)) // now, your inner code has reference to correct id due to closure

发生的情况是,当您收到来自服务器的响应时,for 循环已经完成并且 id 被设置为最后一个值。

使用闭包,id 将引用函数中传递的值,而不是循环中的值

【讨论】:

  • 谢谢,这解决了我的问题。 tyvm :)
  • 欢迎.....:)
【解决方案2】:

您可以将 specificId 与 let 一起使用(它将保留在您的范围内,它是 ES6)。有一个关于闭包的相关 SO 帖子: How do JavaScript closures work?

DoesFileExist('/XML/'+id.trim()+'.xml',function(data) {
                        let specificId = id;
                        console.log(id.trim()+" "+data);
                        if (data == "true") {
                            (function () {
                                console.log("adding to page - "+specificId.trim());
                                AddResultToPage(specificId,false);
                            })();
                        }else{
                           console.log("the file does not exist");
                        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2020-10-04
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多