来自回调的Javascript内联函数调用

时间:2017-06-09 12:28:19

标签: javascript for-loop callback inline

我有一个带回调的函数,用于检查我的服务器上是否存在文件,返回的结果为" true"或"假"。我的问题是我打电话给这个" DoesFIleExist"使用" id"在for循环中运行在函数的早期计算。问题是每当一个函数调用被解析并尝试调用" AddResultToPage"它使用最后一个for循环迭代的id,当它应该使用调用函数时给出的id。

" DoesFileExist" function将路径和回调作为参数。

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

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");
                        }

2 个答案:

答案 0 :(得分: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将引用函数中传递的值而不是循环中的值

答案 1 :(得分:-1)

你可以使用带有let的specificId(它将保留在你的范围内,它是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");
                        }