Javascript:如何实现此执行顺序?

时间:2011-10-03 06:35:56

标签: javascript

我有类似的东西。

function a() {
  ajax(callback_function);
}

callback_function() {
  // done!, called after ajax is finished
}

function b() {
  a();
  c();  // make sure c is executed AFTER a is finished.
}

function c() {
  // called after a()!
}

如何确保在a()完成后调用函数c()?我想我必须使用另一个回调函数,但不确定该怎么做。

编辑

没说清楚。我更喜欢如果我没有在callback_function中调用c(),因为可以在不需要调用c()的情况下调用()。

7 个答案:

答案 0 :(得分:1)

您可以从回调函数中调用c()

答案 1 :(得分:1)

您可以返工a,以便将回调函数作为参数。这样,您可以在需要调用c之后以及不需要调用它的地方调用它:

function a(callback) {
    ajax(callback);
}

function callback_function() { }

function b() {
    a(function() {
        callback_function();
        c();
    });
}

function b2() {
    a(callback_function);
}

function c() { }

答案 2 :(得分:1)

你可以将所有回调包装成一个匿名函数:

function a(callback) {
    ajax(function(){
        callback_function();
        callback();
    });
}

callback_function() {
  // done!, called after ajax is finished
}

function b() {
  a(c);
   // make sure c is executed AFTER a is finished.
}

function c() {
  // called after a()!
}

或者您可以在callback_function注册另一个回调:

function a(callback) {
  ajax(function(){
    callback_function(callback);
});
}

callback_function(callback) {
  // done!, called after ajax is finished
  callback();
}

function b() {
  a(c);
   // make sure c is executed AFTER a is finished.
}

function c() {
  // called after a()!
}

更优雅(更好)的方法是将回调绑定到某个自定义事件,例如“ajax-done”,并且在ajax代码成功执行后,您可以触发该特定事件。
如果使用jquery,则event-method非常简单:

function a() {
  ajax(function(){
    $(window).trigger('ajax-done');
  });
}

callback_function() {
  // done!, called after ajax is finished
}

function b() {
  a();
   // make sure c is executed AFTER a is finished.
}

function c() {
  // called after a()!
}
$(window).bind('ajax-done',callback_function);
$(window).bind('ajax-done',c);

当然你可以在没有jquery的情况下做同样的事情,但是因为你必须确保你的代码是跨浏览器的,所以它有点麻烦。

答案 3 :(得分:1)

如果您不希望将回叫与直接调用c()绑定,则有2个选项:

1.将a更改为:

function a(fn) {
    ajax(function() {
        callback_function();
        if (fn) fn();
    });
}

现在你有了:

function b() {
    a(c);
}

2.在callback_function结束时添加一个信号:

function callback_function() {
    // ...
    emit('callback_done', { param1: true, param2, false });
}

function b() {
    connect('callback_done', c);
    a();
}

答案 4 :(得分:0)

无需创建另一个回调,只需在c函数

的末尾调用callback函数
function a() {
  ajax(callback_function);
}

callback_function() {
  // Do whatever you need with data from ajax
  c();
}

function b() {
  a();
}

function c() {
  // called after a()!
}

答案 5 :(得分:0)

  1. 每个ajax调用都有一个名为onComplete的回调函数,您可以更改它并在其中调用函数c

  2. 下一个解决方案是使用synchronous ajax调用。

  3. c结束时拨打电话callback_function

答案 6 :(得分:0)

如果我已经理解你正在尝试做什么,你可以使用匿名函数来处理这个特殊情况,这意味着你不必修改或复制你的回调函数:

function a() {
    ajax(function() {
        callback_function();
        c();
    });
}
function callback_function() {}
function c() {}