2009-10-09 19 views
10

我有一個簡單的JavaScript函數:強制的JavaScript函數調用要等到前一個完成

makeRequest(); 

它做了一堆東西和一堆的內容放置到DOM。

我作出這樣幾個電話這樣:

makeRequest('food'); 
makeRequest('shopping'); 

然而,他們都火如此之快,他們是在對方的腳趾加強。最終我需要它具有的功能。

makeRequest('food'); 
wait.... 
makeRequest('shopping'); only if makeRequest('food') has finished 

有關讓它們一次只能執行一個的想法?

謝謝!

+2

它們一次只執行一個。這些函數內部必須有異步執行的東西 - 也許是AJAX請求? – Kylotan 2009-10-09 23:54:03

+1

是的,你是對的。有什麼我可以做的嗎? – mwilliams 2009-10-09 23:55:22

回答

15

如果這些函數實際上執行AJAX請求,那麼最好讓它們保持異步。您可以創建一個同步的AJAX請求,但它會阻止瀏覽器響應並導致糟糕的用戶體驗。

如果你需要如果這些AJAX請求是一個接一個地做出的,因爲它們相互依賴,你應該調查你的函數,看看它是否提供回調機制。

makeRequest('food', function() 
{ 
    // called when food request is done 
    makeRequest('shopping'); 
}); 

使用jQuery,它看起來就像是

$.get("/food", function(food) 
{ 
    // do something with food 

    $.get("/shopping", function(shopping) 
    { 
     // do something with shopping 
    }); 
}); 
+0

+1這是要走的路。 – ChaosPandion 2009-10-09 23:58:04

+0

靠近。我試過你的第一個例子,並且沒有調用購物的makeRequest。我可以拋出一個警報,它不會被觸發 – mwilliams 2009-10-09 23:59:53

+0

這意味着你做錯了什麼。你爲什麼不發佈你所做的? – ChaosPandion 2009-10-10 00:01:53

1

我建議你乾脆把它們寫異步 - 例如,調用makeRequest的( '購物');來自第一次調用的AJAX完成處理程序。

如果您不希望異步編寫代碼,請參閱Javascript Strands

1

我假設你有需要對請求的響應照顧的回調方法?一旦完成了,讓它做出下一個請求。

聲明爲隊列陣列,以及一個標誌來跟蹤的狀態:

var queue = [], requestRunning = false; 

在makeRequest的方法:

if (requestRunning) { 
    queue.push(requestParameter); 
} else { 
    requestRunning = true; 
    // do the request 
} 

在回調方法中,服用的護理後響應:

if (queue.length > 0) { 
    var requestParameter = queue.splice(0,1)[0]; 
    // do the request 
} else { 
    requestRunning = false; 
} 
+0

非常好,那就是我需要的。可以結合這裏的方法:http://answers.yahoo.com/question/index?qid=20120102010000AA1olc1 – alexk 2013-02-06 12:11:40

0

如果您需要按順序執行多個請求,請參閱Peter Baker's answer到我的一個類似的問題。

相關問題