上一个功能完成后调用一个函数

Rrr*_*nnn 165 javascript jquery

我有以下JavaScript代码:

$('a.button').click(function(){
    if (condition == 'true'){
        function1(someVariable);
        function2(someOtherVariable);
    }
    else {
        doThis(someVariable);
    }
});
Run Code Online (Sandbox Code Playgroud)

如何确保function2仅在function1完成后调用?

Mik*_*son 188

指定一个匿名回调,并使function1接受它:

$('a.button').click(function(){
    if (condition == 'true'){
        function1(someVariable, function() {
          function2(someOtherVariable);
        });
    }
    else {
        doThis(someVariable);
    }
});


function function1(param, callback) {
  ...do stuff
  callback();
} 
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不是解决方案.这证明它不起作用:http://jsfiddle.net/trusktr/M2h6e/ (13认同)
  • @MikeRobinson这就是问题:如果``do stuff`包含异步的东西怎么办?Function2在预期时仍然不会触发.我在上面的注释中的例子表明,因为`foo()`函数中有异步代码,所以在`foo()`的内容执行完毕后,`bar()`不会触发它的内容,即使使用`$. when().then()`一个接一个地调用它们.这个答案只有在(并且只有)代码中``do stuff`的所有内容都是严格同步的情况下才有效. (11认同)
  • +1,但如果他使用1.5,他可以使用新的Deferreds模式 (10认同)
  • @trusktr希望我能-1你的评论.答案是完全有效的. (3认同)
  • @trusktr 在这种情况下,您需要继续将第一个回调传递到第 _n_ 层异步调用,然后在所有 _n_ 异步调用完成后触发 `callBack()` 。由于 OP 没有提到他在函数中所做的事情,因此假定它是一级异步调用。 (2认同)

phi*_*kle 92

如果您使用的是jQuery 1.5,则可以使用新的Deferreds模式:

$('a.button').click(function(){
    if(condition == 'true'){
        $.when(function1()).then(function2());
    }
    else {
        doThis(someVariable);
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑:更新的博客链接:

丽贝卡·墨菲对这个伟大的写在这里:http://rmurphey.com/blog/2010/12/25/deferreds-coming-to-jquery/

  • 那对我来说根本不起作用.function1和function2都在完全相同的时间执行(人眼可以观察到).这是一个很小的例子:http://jsfiddle.net/trusktr/M2h6e/ (10认同)
  • 但这是一个有效的例子吗?什么是推迟的?您正在立即执行function1和function2.(我不是原来的评论者.) (2认同)

Tua*_*ong 39

试试这个 :

function method1(){
   // some code

}

function method2(){
   // some code
}

$.ajax({
   url:method1(),
   success:function(){
   method2();
}
})
Run Code Online (Sandbox Code Playgroud)

  • 辉煌的hack :) (3认同)

Dom*_*see 36

这个答案使用promisesECMAScript 6标准的JavaScript功能.如果您的目标平台不支持promises,请使用PromiseJs对其进行填充.

Promise是一种新的(并且更好)处理JavaScript中异步操作的方法:

$('a.button').click(function(){
    if (condition == 'true'){
        function1(someVariable).then(function() {
            //this function is executed after function1
            function2(someOtherVariable);
        });
    }
    else {
        doThis(someVariable);
    }
});


function function1(param, callback) {
    return new Promise(function (fulfill, reject){
        //do stuff
        fulfill(result); //if the action succeeded
        reject(error); //if the action did not succeed
    });
} 
Run Code Online (Sandbox Code Playgroud)

对于这个简单的示例来说,这似乎是一个重要的开销,但对于更复杂的代码,它远比使用回调更好.您可以使用多个then语句轻松链接多个异步调用:

function1(someVariable).then(function() {
    function2(someOtherVariable);
}).then(function() {
    function3();
});
Run Code Online (Sandbox Code Playgroud)

您还可以轻松地包装jQuery deferrds(从$.ajax调用返回):

Promise.resolve($.ajax(...params...)).then(function(result) {
    //whatever you want to do after the request
});
Run Code Online (Sandbox Code Playgroud)

正如@charlietfl所说,实现接口jqXHR返回的对象.所以实际上没有必要将它包装成a ,它可以直接使用:$.ajax()PromisePromise

$.ajax(...params...).then(function(result) {
    //whatever you want to do after the request
});
Run Code Online (Sandbox Code Playgroud)


de *_*aad 19

或者,您可以在一个函数完成时触发自定义事件,然后将其绑定到文档:

function a() {
    // first function code here
    $(document).trigger('function_a_complete');
}

function b() {
    // second function code here
}

$(document).bind('function_a_complete', b);
Run Code Online (Sandbox Code Playgroud)

使用此方法,函数'b'只能执行AFTER函数'a',因为触发器仅在函数a执行完毕时存在.


Jay*_*aya 8

你可以这样做

$.when(funtion1()).then(function(){
    funtion2();
})
Run Code Online (Sandbox Code Playgroud)