我想在另一個函數完成後運行一個函數。如何使用jQuery。當.done
$.when(saveCanvas(canvas)).done(setWallPaper());
每個函數都能正常工作,但是當我運行上面的代碼時,它只運行第一個函數。
我需要改變什麼?
我想在另一個函數完成後運行一個函數。如何使用jQuery。當.done
$.when(saveCanvas(canvas)).done(setWallPaper());
每個函數都能正常工作,但是當我運行上面的代碼時,它只運行第一個函數。
我需要改變什麼?
現在回想起來,這似乎是它的工作原理與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年中發生了變化。被調用的函數很可能是一個問題。
根據對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();
}
你說得對,它立即運行,但通過畫布沒有似乎有影響。 – 2013-03-24 02:54:43
@PhilipK編輯我的答案,建議一個不同的解決方案 – 2013-03-24 03:01:54
請記住,承諾必須在某個時候解決,否則完成的回調將永遠不會觸發。 – bfavaretto 2013-03-24 03:10:54
再大膽猜一下:在這個
$.when(saveCanvas(canvas)).done(function(){
setWallPaper()
});
很難回答,沒有看到實際功能的實現,但瘋狂猜測'$ .when(saveCanvas(canvas))。done(setWallPaper);' – 2013-03-24 02:41:37