Jquery延迟不触发完成或何时触发

时间:2014-05-05 19:07:50

标签: javascript jquery ajax jquery-deferred

我有2个ajax调用,我通过$ .when附加,以便在完成后执行某些任务。

代码如下所示:

function ajaxCall(url, targetDiv) {
    dfd = new $.Deferred();
    $.ajax({
        url:url
        success : function(data) {
            dfd.resolve(data, targetDiv);
        }
    })
    return dfd.promise()
}

d = ajaxCall('/somewhere/', 'myDiv');
d2 = ajaxCall('/somewhere/else', 'myNewDiv');
$.when(d, d2).then(function(){alert('all done');})

在这种情况下,我们从未完成所有已完成的警报调用。我们大致遵循https://api.jquery.com/deferred.promise/

的大纲

当检查这个时,我们可以看到d和d2都不会调用done(如果我们附加一个done),但是调用ajax调用的成功部分。

1 个答案:

答案 0 :(得分:3)

语法分析器模式...... STOP!

function ajaxCall(url, targetDiv) {
    dfd = new $.Deferred(); // <-- Wait, a global variable?

第二个ajaxCall(...)正在设置一个不同的Deferred实例,并且第一个延迟将永远不会被解析(您将相同的变量设置两次,因此调用.resolve(...)仅在第二个ajaxCall(...)函数调用上,并且您没有解析第一个延迟对象,因为它已经消失了!)。

解决方案:

function ajaxCall(url, targetDiv) {
    var dfd = new $.Deferred(); // <-- Oh! A local variable... :)

你想要一个好的建议吗?始终用var声明变量,因为在函数作用域中声明的变量将被添加到函数实例中,而不是window对象:

// Both sentences are equivalent in a function scope (or in the global scope)
a = "hello";
window.a = "hello";