2013-03-05 31 views
2

我有3個功能:func1的FUNC2FUNC3運行功能串行和並行

func1的FUNC2使用load()動態取內容。

func3對由func2加載的內容運行並在其上顯示動畫。

我想FUNC1FUNC2運行(更好的性能)平行,然後我想FUNC3運行一次前兩次完成。

var funcList = ['func1','func2']; 
$.each(funcList, function(i,v){ 
     window[v](); 
}) 
func3(); 

我注意到FUNC3的動畫()犯規運行可能堂妹FUNC2 wasnt的內容獲取呢。一旦加載頁面並且動畫運行正常,我就從控制檯運行func3()。這是爲什麼發生? Isnt each()同步?

+2

是,'jQuery.each()'** **是同步的,但你的兩個功能都沒有。它會執行這兩個函數,然後執行'func3()',但由於其他兩個函數都有AJAX調用,所以回調函數並不保證被執行。 – 2013-03-05 09:37:34

回答

0

,這是因爲$.ajax是異步的..由時間func3叫,也不能保證其他兩個Ajax調用已經完成successfully..you可以使用$.when檢查返回承諾,一旦這兩個功能是解決了運行第三個功能。

試試這個

$.when(funcList).then(func3) 

例如

var func1=function(){ 
    return $.get('url',function(data){....}); 
} 

var func2=function(){ 
    return $.get('url2',function(data){....}); 
} 

function func3(){ 
    // animation here 
} 

$.when(func1(),func2()).then(func3) 
+0

'$ .when(func1(),func2())'確保1和2並行運行嗎? – soundswaste 2013-03-05 09:44:32

+0

yes ..它並行運行... $ .when提供了一種方法來執行基於一個或多個對象的回調函數,通常是表示異步事件的Deferred對象......所以如果函數在執行成功時轉到'然後'.. – bipen 2013-03-05 09:47:33

+0

嘿,我不能讓你的方法工作。我已經做了一個簡單的小提琴:http://jsfiddle.net/Y4PHM/1/你可以請看看它,並得到它的工作? – soundswaste 2013-03-05 10:30:10