异步回调

5
我已经编写了一个使用jQuery进行异步请求的函数。
var Site = {

    asyncRequest : function(url, containerId) {        
        $.ajax({
            url : url,
            onSuccess: function(data){
                $(containerId).html(data);
            }
        });
    }
}

由于我使用的是记事本,因此语法可能略有不正确,但希望您能理解我的意思。

我调用了这个函数:

Site.asyncRequest('someurl', container1);
Site.asyncRequest('someurl', container2);

两个请求都被发送并由服务器处理。我期望会有两个响应返回,但是问题是只有最后一个响应被显示了,我不知道为什么。也不知道jQuery ajax如何跟踪请求/响应,所以可能这就是问题所在。比如我发出5或10个请求,jQuery ajax如何知道哪个响应对应哪个请求,它又在哪里跟踪呢?谢谢。

嗨,谢谢。我可以尝试将一个函数作为参数传递,然后从OnSuccess中调用该函数。我会看看能否让它正常工作。我的主要担忧是无法轻松调试和追踪发生的情况。 - user338195
2个回答

5

这似乎是一个 JavaScript 作用域问题。请尝试以下操作:

var Site = {
    asyncRequest: function(url, containerId) {
        (function(theContainer) {
            $.ajax({
                url: url,
                onSuccess: function(data) {
                    $(theContainer).html(data);
                }
            });
        })(containerId);
    }
};

这为每个函数调用创建了一个独立的作用域,因此对于每个onSuccess匿名函数,"theContainer"指向的实际值是不同的。


@SheikhHeera,事实上并非如此,原因有点难以理解:.ajax方法在事件循环的当前事件中使用url参数,而containerId/theContainer值则在事件循环的另一个事件中使用。由于Javascript是单线程的,url参数不可能是我们所期望之外的任何值。只有当onSuccess函数需要使用它时,我们才需要重新定义url的作用域。 - user1207456

1
这里发生的是由于函数声明方式,创建了一个单一的闭包。请参见此处的“更高级的示例”:http://skilldrick.co.uk/2010/11/a-brief-introduction-to-closures/ 基本上,containerId 在所有 onSuccess 匿名函数实例之间共享。我没有测试过,但我相信如果你在 Site 之外定义了你的 asyncRequest 函数,这将起作用。
至于更优雅的解决方案,也许其他人会回答得更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接