1

我有一个功能应该一个接一个地运行,例如:

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

我这样称呼他们:

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

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

如何先运行 cutTomatoesAlone(15),完成后运行cookTomatoes(10)


编辑: cutTomatoesAlone()加载外部 JSON。cookTomatoes(10)在...上下功夫。

4

5 回答 5

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);
});
于 2013-07-11T10:21:54.333 回答
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 上触发。

于 2013-07-11T10:19:27.720 回答
1

您需要方法 ThesetTimeout()将等待指定数量的milliseconds,然后执行指定的函数。

function cutTomatoesAlone(Kg){
    // slice my stuff

    setTimeout(function() { 
      cookTomatoes(10)
         }, delay);
    }
于 2013-07-11T10:13:27.437 回答
1

了解承诺和延迟对象。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 就会被解析。

于 2013-07-11T10:37:21.510 回答
1

如果您的函数是独立的,那么它应该按照您期望的方式工作,假设您没有做诸如异步发出 http get 请求之类的事情。

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

于 2013-07-11T10:16:03.847 回答