2013-02-19 77 views
3

我正在使用jQuery 1.9.1。我有一個自定義函數執行一些操作,然後執行$ .ajax調用。我想按順序調用這個函數。我嘗試過$ .when,但它不能解決我的問題。jquery - 按順序執行自定義函數調用

function func(param) { 
    //some operations 
    $.ajax() 
} 

main() { 
    //first call 
    func(param1); 
    //wait for done and the run the second 
    func(param2); 
} 
+0

你有沒有考慮過使用回調? – 2013-02-19 18:54:58

+0

AJAX =異步JavaScript和XML。如果不使用回調函數,您需要改爲使用「同步」。 – crush 2013-02-19 18:56:18

回答

4

您可以將您的ajax呼叫作爲延遲返回給您,以便您訪問done功能。 http://api.jquery.com/category/deferred-object/

查看Shauna的答案以獲得對ajax更深入的解釋。

function func(param) { 
    //some operations 
    return $.ajax() 
} 

main() { 
    //first call 
    func(param1).done(function(){ 
     //wait for done and the run the second 
     func(param2); 
    }); 

} 
+1

一個優雅的解決方案。不會向用戶解釋爲什麼它最初不起作用。 – crush 2013-02-19 19:17:07

+0

我有同樣的問題。該函數從具有不同參數的循環中調用。 'for(var i = 0; i PlanetHackers 2015-08-04 13:05:58

+1

@PlanetHackers你需要打開另一個問題。評論並不是一個好的地方。 – Jack 2015-08-04 13:20:08

6

AJAX調用是異步的,這意味着您將永遠無法調用它們以便按照您的操作方式進行調用。

你想要做什麼,而是利用$.ajax()調用中的回調函數。你最終會得到這樣的結果:

function func(param) { 
    // Other stuff 
    $.ajax({ 
     success: func(param2) 
    }) 
} 

但是,要小心無限循環,因爲你調用了相同的函數。這可能是值得看的jQuery來源爲ajax()方法,看看他們是如何處理的回調,寫你的方法以類似的方式,所以你可以用類似結束:

main() { 
    func(param1, {success: func(param2)}); 
} 

(注: $.ajax()確實有一個async設置,您可以設置爲false,但IMO可以很好地理解AJAX和回調的工作原理,因爲您將使用預期行爲而不是反對它,從長遠來看可以節省您的麻煩,此外,大型同步AJAX通話可能會導致您的網站無響應,這對您的用戶體驗不利。)

+1

+1來解釋它。讓我們只希望用戶真正閱讀並學習,而不是僅僅接受似乎有用的東西。 – crush 2013-02-19 19:17:39