Javascript Jquery延迟未到达最后一个。然后

Javascript Jquery延迟未到达最后一个。然后,javascript,jquery,promise,deferred,Javascript,Jquery,Promise,Deferred,我有一系列必须执行的功能。除了最后一个,它们都按顺序执行。d1执行,d2执行,d3执行,然后在解析d4之前执行done函数中的代码。不知道为什么。任何帮助都将不胜感激 $(document).ready(function() { var d1 = functiond1(); var d2 = functiond2(); var d3 = functiond3(); var d4 = functiond4(); d1.then(d2).then(d3).t

我有一系列必须执行的功能。除了最后一个,它们都按顺序执行。d1执行,d2执行,d3执行,然后在解析d4之前执行done函数中的代码。不知道为什么。任何帮助都将不胜感激

$(document).ready(function() {
    var d1 = functiond1();
    var d2 = functiond2();
    var d3 = functiond3();
    var d4 = functiond4();

    d1.then(d2).then(d3).then(d4).done(function() {

    //Code here does not wait for d4 to end before executing
    //HELP! 

    });
});

function functiond1() {
    var dfd = $.Deferred();

    //Do stuff here
    //Works in sequence

    dfd.resolve();
    return dfd.promise();
}


function functiond2() {

    var dfd = $.Deferred();
    params = jQuery.param({
        'parm1': 1,
        'parm2': 2,
        'parm3': 3
    });


    jQuery.getJSON($.webMethoJSONGet1, params).done(function(data) {

        //Do stuff here
        //Works in sequence

        dfd.resolve();

    });

    return dfd.promise();
}

function functiond3() {
    var dfd = $.Deferred();

    //Do stuff here
    //Works in sequence

    dfd.resolve();
    return dfd.promise();
}

function functiond4() {

    var dfd = $.Deferred();

    params = jQuery.param({
        'parm1': 1,
        'parm2': 2,
        'parm3': 3
    });

    jQuery.getJSON($.webMethoJSONGet2, params).done(function(data) {

        //Do stuff here
        //does not work in sequence

        dfd.resolve();

    });

    return dfd.promise();
}

我在一个项目中也遇到了同样的问题,这个带有阵列的解决方案运行良好:

$(文档).ready(函数(){
var-pr=[];
var d1=functiond1();
var d2=functiond2();
变量d3=函数d3();
var d4=functiond4();
函数functiond1(){
var dfd=$.Deferred();
pr.push(dfd);
setTimeout(函数(){
$('body').append('1已解析
'); 解析(); }, 2000); } 函数functiond2(){ var dfd=$.Deferred(); pr.push(dfd); params=jQuery.param({ “parm1”:1, “parm2”:2, “parm3”:3 }); setTimeout(函数(){ $('body').append('2已解析
'); 解析(); }, 3000); } 函数functiond3(){ var dfd=$.Deferred(); pr.push(dfd); setTimeout(函数(){ $('body').append('3已解析
'); 解析(); }, 1000); } 函数functiond4(){ var dfd=$.Deferred(); pr.push(dfd); params=jQuery.param({ “parm1”:1, “parm2”:2, “parm3”:3 }); setTimeout(函数(){ $('body').append('4已解析
'); 解析(); }, 50); } $.when.apply($,pr).then(function(){ //做点什么 $('body').append('proceducewithcode execution'); }); });
很难说你想用这些承诺做些什么。首先调用所有4个函数,然后尝试用一堆
然后
回调链接它们。如果要按顺序将它们链接在一起,应如下所示:

functiond1()
.then(functiond2)
.then(functiond3)
.then(functiond4)
.done(function() { /* blah */ });
如果您只想在所有操作完成后获得结果,可以使用
$。当

$.when(functiond1(), functiond2(), functiond3(), functiond4())
.then(function(resultd1, resultd2, resultd3, resultd4) { /* blah */ });
另一方面,在函数中创建的承诺是在另一个不必要的承诺的
done
回调中解析的。
$.getJSON.done()
调用本身返回一个承诺,因此不需要额外的承诺。只需返回从
done()
返回的承诺即可


很抱歉,我没有对jQuery延迟对象进行太多的处理,但是它们看起来与标准承诺非常相似。

要按顺序运行函数,需要传递对
链中函数的引用。然后是
链,而不是调用这些函数的结果

e、 g

问题的最终原因是,直接调用
d4
将导致其已解决的承诺立即传递到
.done
,而不考虑
链早期部分的状态。然后

您也不应该用额外的承诺来包装JSON函数,因为
$.getJSON
已经返回了一个承诺,如果AJAX查询失败,该承诺将被拒绝:

function functiond4() {
    ...
    return $.getJSON(...);
}

当请求帮助时,请将代码缩进可读。我已经通过jsbeautifier为您运行了代码。很好的提示。按要求做。关于代码有什么提示吗?为什么到目前为止所有代码都缩进了?我已经帮你修好了,现在右边的部分比需要的多。我已经修复了它。延迟链进入$(document).ready()中。这是最后一次修理了。不,你没有。您的
getJson.done()
返回一个承诺,并且应该是函数返回的内容。在其中嵌套另一个承诺完全违背了使用承诺的目的。谢谢你的回答。我正在验证。不客气,请共享您的代码,以防它不起作用。注意:此代码将使所有四个函数同时运行,并行执行它们的异步操作,并且只有在它们全部完成后才进行解析。因此,确实如此-我误解了这一点。这实际上是他的问题,then@Alnitak使用此代码,您可以完全实现ricardo想要的功能:->独立运行所有函数->在承诺集合中注册它们->一旦所有承诺都得到解决,继续执行一些逻辑否,这是错误的-您必须将函数引用传递给
。然后
,不是调用该函数的结果immediately@Alnitak我修正了延迟调用
内部的函数,然后
。谢谢。是的,我正在调用函数,每个函数都返回一个承诺,在前一个问题解决之前不应继续到下一个问题,但最后一个问题不会等到解决。谢谢回答。不要注意函数名。在我发布问题之前,我将它们从原件中更改,以强调功能顺序。相信那些不是我用的名字。
function functiond4() {
    ...
    return $.getJSON(...);
}