JQuery 完成后不停止执行

JQuery when done not stopping execution

我有这段代码,我想做的是仅在 function1 完成并返回我需要的标志后才执行 function0,但我做不到。 function0 上的 when().done() 始终在第一个 运行 上执行,并使我的其余代码执行。

function0 总结

function0: function(e) {
        e.preventDefault();

        var valid = false;

        var dfd = $.Deferred();
        $.when(function1(e)).done(function(v){
            valid = v; // -> right here valid is undefined
            dfd.resolve();
        });

        dfd.promise();

        if(!valid) {
            alertSomething();
            return;
        }

        keepExecutingCode();
    },

函数1总结

function1: function(e){
            e.preventDefault();            
            var df = $.Deferred();
            var flag = true;
            App.resetDiv('#div');
            getSomething();
            getSomething2();
            $.when(getSomething3()).done(function(){
                $.when(getSomething4()).done(function(){
                    if (cond1()){
                        doSomething5();                
                        if (cond2()){
                            $.when(doSomething6(),doSomething7()).done(function(var1, var2){
                                doSomething8(var1,var2);
                                flag = true;
                                updateSomething();
                            });
                        }else{
                            flag = false;
                            updateSomething2();
                        }
                    }else{ flag2 = false;
                        showSomething();
                        flag3 = false;
                    }
                    df.resolve(flag);
                });
            //PROBLEM 1 RIGHT HERE
            //df.promise();
            //return flag;
            });
        // it should be
        return df.promise();
        },

我知道问题可能出在其他函数的 deferred 上,因为在 function0 内部它总是执行解析,即使没有 v 值,一旦它到达 if(!valid) valid is undefined.

我做错了什么?

Update - It's solved

function0: function(e) {
    e.preventDefault();

    var valid = false;

    var dfd = $.Deferred();
    //$.when(function1(e)).done(function(v){
    // had to change .done to .then
    $.when(function1(e)).then(function(v){
        valid = v; // -> right here valid is undefined
        if(!valid) {
            alertSomething();
            return;
        }
        // had to change the scope and make it inside the .then so that it only executes when I have the value
        keepExecutingCode();
        dfd.resolve();
    });

    dfd.promise();


},

还必须将 function1 中的 .done 更改为 .then

非常感谢 ;)

看起来你没有捕捉到你的 deferreds 的错误事件。 (取决于你的jQuery-Version,)你可以通过两种方式做到这一点:

  • 使用 .fail-回调
    在这里,您将其添加到 done-callback 之后,这样您就可以响应 deferred
  • 的 reject-callback
  • 将 .done 替换为 .then 并使用第二个回调
    在这里,您只需将用于处理错误的函数插入到 then-function
  • 的第二个参数中