如何在第一次完成后'链接'JS函数

时间:2013-07-11 10:11:17

标签: javascript jquery

我有一个函数应该在另一个之后运行一个,例如:

function cutTomatoesAlone(Kg){
    // slice my stuff
}
function cookTomatoes(Minutes){
    // boil my stuff
}

我称之为:

cutTomatoesAlone(15) // 15kg, need 3 hours!
cookTomatoes(10); // need 10 minutes

但是,在我的cutTomatoesAlone(15)之前,cookTomatoes(10)完成了。

如何首先运行cutTomatoesAlone(15)并在完成后运行cookTomatoes(10)


编辑: cutTomatoesAlone()加载外部JSON。 cookTomatoes(10)正在努力。

5 个答案:

答案 0 :(得分:1)

您需要等待指定数量setTimeout()的{​​{1}}方法,然后执行指定的函数。

milliseconds

答案 1 :(得分:1)

如果你的函数是独立的,那么它应该按照你期望的方式工作,假设你没有像异步地发出http get请求那样。

如果你是,你需要做的是当第一个函数从它的请求返回时使用JQuery的$ .done()函数调用第二个函数。

答案 2 :(得分:1)

给cutTomatoesAlone一个回调。

var cookingTimePerKg = 10;

function cutTomatoesAlone(Kg, Callback) {
  // slice my stuff

  // when done and a callback is defined do the callback
  if(Callback) Callback(Kg*cookingTimePerKg);
}

然后你可以做到以下几点:

cutTomatoesAlone(15, cookTomatoes);

也可以在(潜在)XHR请求的onComplete上触发回调。

答案 3 :(得分:1)

一些Function对象原型调优会使其更容易阅读

Function.prototype.after = function(callback){
    this();
    if( typeof(callback) == "function")
        callback();
}

a = function(){alert(1)};
a.after( function(){alert(2)} )

所以烹饪主题:

var cutThem = function(){
    cutTomatoesAlone(15) // 15kg, need 3 hours!
}
cutThem.after( function(){
     cookTomatoes(10);
});

这是一个通用的提案,当ajax加载到游戏中时,最好使用他们的“whenDone”选项为他们提供回调。

$("#basket").load("url.extension", {kilos: kg}, 
function(){
     cookTomatoes(10);
});

答案 4 :(得分:1)

Learn about promises and deferred objects。 jQuery中的每个Ajax函数都返回一个promise,因此您可以轻松地链接函数调用。

例如:

function cutTomatoesAlone(Kg) {
    return $.getJSON(...); // return the promise provided by $.getJSON
}

// called as
cutTomatoesAlone(15).then(function() { // attach callback
    cookTomatoes(10);
});

如果是Ajax调用,一旦成功检索到响应,就会解析promise。