2013-03-24 31 views
2

我想在另一個函數完成後運行一個函數。如何使用jQuery。當.done

$.when(saveCanvas(canvas)).done(setWallPaper()); 

每個函數都能正常工作,但是當我運行上面的代碼時,它只運行第一個函數。

我需要改變什麼?

+6

很難回答,沒有看到實際功能的實現,但瘋狂猜測'$ .when(saveCanvas(canvas))。done(setWallPaper);' – 2013-03-24 02:41:37

回答

0

現在回想起來,這似乎是它的工作原理與jQuery:

function f1() { 
 
\t alert("function one"); 
 
} 
 

 
$.when(f1()).done(function() { 
 
    alert("function 1 is done running function two"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

注意:這與我在問題中發佈的方法完全相同,所以本質上它應該可行。儘管jQuery可能在過去的3年中發生了變化。被調用的函數很可能是一個問題。

7

根據對another SO question的評論,$.when需要延遲對象作爲參數。如果你沒有傳遞任何東西,回調將立即被調用。

setWallPaper()似乎不工作,因爲它實際上是在saveCancas(canvas)之前運行? saveCanvas()實際上並不是deferred object,其when預計它是。要使其成爲延遲對象,請將dfr = $.Deferred();添加到您的saveCanvas()函數的開頭,並將return dfr.promise();加到它的末尾。查看this SO answer瞭解更多詳情。

function saveCanvas(canvas) 
{ 
    dfr = $.Deferred(); 
    //Your code 
    return dfr.promise(); 
} 

瞭解更多:http://api.jquery.com/jQuery.when/

+0

你說得對,它立即運行,但通過畫布沒有似乎有影響。 – 2013-03-24 02:54:43

+0

@PhilipK編輯我的答案,建議一個不同的解決方案 – 2013-03-24 03:01:54

+0

請記住,承諾必須在某個時候解決,否則完成的回調將永遠不會觸發。 – bfavaretto 2013-03-24 03:10:54

1

再大膽猜一下:在這個

$.when(saveCanvas(canvas)).done(function(){ 
    setWallPaper() 
}); 
相關問題