$ .when()。done()不起作用

时间:2016-06-06 05:46:55

标签: javascript jquery

我在使用jQuery的$ .when()。done()函数时遇到了一些问题。有人可以帮忙吗?当我有ajax调用和非ajax调用方法时,即使我使用$ .when()。done(),也会调用非ajax调用。请参阅下面的代码段。方法/功能三正在运行。

$(document).ready(function () {
    Initial();
});

function Initial() {
    debugger;
    var emp = { Name: "Ram", Age: 10 };
    Main(emp);
}

function Main(em) {
    $.when(One(em)).done(Two(em)).done(Three(em.Name));
}

function One(et) {
    //some ajax call
    console.log("One");
}

function Two(et) {
    //some ajax call
    console.log("Two");
}

function Three(et) {
    console.log(et);//not an ajax call
    console.log("Three");
}

修改

下面是Vohuman修改之后的代码片段,它像魅力一样工作

$(document).ready(function () {
        Initial();
    });

    function Initial() {
        debugger;
        var emp = { Name: "Ram", Age: 10 };
        Main(emp);
    }

    function Main(em) {
        var def1 = $.Deferred();
        var def2 = $.Deferred();
        One(em, def1);
        Two(em, def2);
        $.when(def1, def2).done(function () {
            Three(em.Name)
        });
    }

    function One(et, defObj) {
        //some ajax call
        if (defObj) {
            defObj.resolve();
        }
        console.log("One");
    }

    function Two(et, defObj) {
        //some ajax call
        if (defObj) {
            defObj.resolve();
        }
        console.log("Two");
    }

    function Three(et) {
        console.log(et);//not an ajax call
        console.log("Three");
    }

2 个答案:

答案 0 :(得分:2)

()称为调用运算符。它调用一个函数。这意味着你自己调用函数,并且函数的返回值被设置为回调,而不是函数本身。

$.when(One(em)).done(Two).done(Three);

如果你想用参数调用回调,你应该使用中间件,即另一个函数。

function Main(em) {
    $.when(One(em)).done(function() {
       Two(em);
    }).done(function() {
       Three(em.Name);
    });
}

另请注意,如果要发送多个ajax请求并在所有请求完成后执行回调,则可以将多个延迟对象传递给$.when

$.when(deferredOne, deferredTwo).then(function(resolvedValueOne, resolvedValueTwo) {

});

作为建议,不要将PascalCase名称用于常规函数。按照惯例,在JavaScript中,PascalCase名称用于命名构造函数和类。

答案 1 :(得分:0)

另一种做法是

$.when(One(em), Two(em)).done(function( a1, a2 ) {
        Three(em.Name)
       });

但是One和Two方法必须返回promise对象。