0
我有一個問題,我試圖解決在JavaScript中使用延期對象(我是新的延期對象)。延期對象的問題
問題: 用戶試圖運行一個函數(可以是很多不同的函數)。如果功能失敗...它會嘗試再次登錄,然後重試(一次)。如果登錄失敗。那麼所有失敗。
這些函數和登錄函數包含一個將被返回的Ajax調用。
我的問題是: 在函數中的所有其他代碼運行後,我可以依賴var dfd(在tryAjax函數的末尾)最後執行嗎?
下面是代碼:
function tryAjax(func)
{
var dfd = new jQuery.Deferred();
window[func]().then(
function(p1,p2,p3)
{
//Everything worked great. No need to login.
dfd.resolve(p1,p2,p3);
},
function()
{
//func failed
//try to login user again before trying.
loginUser().then(
function()
{
//Login success
//Try to run func again.
window[func]().then(
function(p1,p2,p3)
{
//Func succes after login
dfd.resolve(p1,p2,p3);
},
function(p1,p2,p3)
{
//Func failed after login
dfd.reject(p1,p2,p3);
});
},
function(p1,p2,p3)
{
//Login failed
dfd.reject(p1,p2,p3);
});
});
return dfd;
}
And to call it:
tryAjax('getData').then(
function(p1,p2,p3)
{
//Success
},
function(p1,p2,p3)
{
//Error
});
「所以基本上,你想執行3順序延期,並在第一次成功後停止」。 這取決於。邏輯是,函數調用是運行一個Ajax函數並返回的通用函數(在本例中爲getData()。如果這樣,一切都應該結束,如果失敗,它會嘗試調用loginUser()函數(會嘗試登錄用戶),如果該函數失敗......全部失敗,如果有效,第一個嘗試失敗的函數(在這種情況下,getData())將再次運行,如果失敗了。如果它工作...那麼一切都很好 – Juw
謝謝你的回答,並花時間在原始文章中,你寫了與我完全相同的代碼,只有我在函數中使用它並使用窗口[func]()能夠調用任何函數(返回一個待處理的ajax延遲對象)。但是這引發了一個問題。我可以依靠dfd在主代碼和延期完成後返回。 。檢查出我提出的這個簡化函數: http://stackoverflow.com/questions/12386728/deferre d-對象返回-IT-被拒絕的前 - -或分辨 – Juw