2013-07-11 31 views
1

我有應該運行一前一後一功能,例如:如何後的第一個「鏈」 JS功能已完全處理

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)就可以了。

+1

actaully它取決於你的函數內的代碼..如果代碼是asynchorus或synchronus ...如果synchoronus那麼代碼你應該工作..反正請添加所有的代碼 – bipen

+0

@Hugolpz:兩者都在同步調用?在那種情況下,只有在完成第一種方法的執行後,第二種方法纔會開始。 –

+0

是的,這完全取決於'cutTomatoesAlone'的內容。 – lonesomeday

回答

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呼叫的情況下,一旦響應被成功地檢索到的承諾得到解決。

1

您需要的方法setTimeout()它將等待指定的數字milliseconds,然後執行指定的功能。

function cutTomatoesAlone(Kg){ 
    // slice my stuff 

    setTimeout(function() { 
     cookTomatoes(10) 
     }, delay); 
    } 
+0

對我而言,時間是未知的。取決於getJSON等,但是,+1! – Hugolpz

+0

@Hugolpz如何將延遲也傳遞給param? –

1

如果你的職責是獨立的,它應該工作,你所期望的方式,假設你沒有做這樣的東西做HTTP GET請求異步。

如果你是,你需要做的是當第一個函數從請求返回時使用JQuery的$ .done()函數調用第二個函數。

+0

我做了一個getJSON。讓我們來探討一下http://api.jquery.com/deferred.done/ – Hugolpz

1

給cutTomatoes一個回調。

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解僱。

1

一些功能對象原型調整將使其更容易閱讀

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); 
}); 

這是通用的建議,當阿賈克斯負載上的遊戲它的最好使用他們的「whenDone」選項爲他們提供回調。

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

它與依次調用'cutTomatoesAlone'和'cookTomatoes'仍然是一樣的,所以它沒有什麼區別。如果OP的代碼不能按需要工作,這也不會。 –