Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $.when().done()不起作用_Javascript_Jquery - Fatal编程技术网

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

Javascript $.when().done()不起作用,javascript,jquery,Javascript,Jquery,我在使用jQuery的$.when().done()函数时遇到了一些问题。有人能帮忙吗?当我有ajax调用和非ajax调用方法时,即使我使用$.When().done(),非ajax调用也在调用。请参阅下面的代码片段。方法/函数3之前正在运行 $(document).ready(function () { Initial(); }); function Initial() { debugger; var emp = { Name: "Ram", Age: 10 };

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

$(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");
    }
()
称为调用操作符。它调用一个函数。这意味着您自己正在调用函数,函数的返回值设置为回调,而不是函数本身

$.when(One(em)).done(Two).done(Three);
如果您希望使用参数调用回调,则应使用中间件,即另一个函数

function Main(em) {
    $.when(One(em)).done(function() {
       Two(em);
    }).done(function() {
       Three(em.Name);
    });
}
还请注意,如果希望发送多个ajax请求并在所有请求完成后执行回调,则可以将多个延迟对象传递给
$。当
:

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

});

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

另一种方法是

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

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

控制台日志值返回正常,我没有看到错误。如果您从您的角度观察,请粘贴完整的错误消息好吗?@Naga Sai A,我没有收到任何代码错误。。但执行的顺序并不像预期的那样。当一和二被完全执行时,我需要执行函数三。实际上,你应该使用“then”而不是“done”。我得到的输出是一个两个Ram三,我认为这听起来不错。问题出在哪里?@phreakv6,如果您使用函数1和函数2添加一些ajax调用,那么您可以看到不同的输出。上面的代码给出了预期的结果,因为其中三个函数是非ajax的。随着变化,执行顺序是这样的。函数二()函数三()函数一()如何按一()、二()和三()的顺序执行。建议不要对常规函数使用PascalCase名称。按照惯例,在JavaScript中,PascalCase名称用于命名构造函数和类是的,我正在跟踪带有函数名的驼峰案例,为了测试,我使用了这样的名称。。无论如何,谢谢你的建议。@Buddha是的,这应该是订单。
done
回调按指定顺序执行。您可能正在寻找答案中的第二个建议片段。如果第二个请求需要来自第一个请求的数据,那么您应该在第一个请求的
done
处理程序中发送请求。使用第一个代码片段,我们可以按顺序执行吗?我不是java脚本方面的专家,所以您能提供一些带有第二个代码片段的示例代码吗?目前它有一个订单。我认为jQuery文档会有所帮助。请更新您的问题,并更具体地说明您正在努力实现的目标。