2012-05-29 47 views
1

我一直在使用jQuery中的$ .Deferred()最近測試了一下,並得到了一個問題。儘管延期和承諾對於僅運行一次的ajaxcalls來說非常棒,但我還得到了一個表單,用於添加新用戶,使用ajax發佈帖子需要多次運行。現在,這個延遲/承諾的二進制(ish)狀態崩潰,因爲一旦它們被解決或拒絕,它將保持該狀態。所以我的問題是:用jQuery多次發佈表單推遲

- 我可以使用推遲的任務,將被多次調用? - 如果可能的話,建議使用延期還是應該使用$ .ajax的成功/錯誤回調來堅持舊方法?

這裏有一些代碼,我張貼在一起的表格,這一次很好,但不是多次。

var submittingUser = new $.Deferred(); 
var savingUser = submittingUser.pipe(function(data) { 
    return $.post('ajax.php', data); 
}); 

$("#add_new_user").click(function() { 
    var data = $("#add_user_form").serialize(); 
    submittingUser.resolve(data); 
    return false; 
}); 

savingUser.then(function() { 
    //Success 
}, function() { 
    //Failed 
}); 
+0

我會回到使用直接的方法。正如您發現的那樣,延遲對象不能被解析多次。 –

回答

2

這是沒有意義的使用該方式推遲。延期代表一項行動;你不能將它用作事件發射器。在啓動異步操作時使用延遲,並且當該操作成功或失敗時要執行某些操作。

$.post()返回一個承諾(實際上它返回一個jqXHR實例,但實現承諾接口),所以你可以做$.post(...).fail(handleFailure).done(handleSuccess)。但是每次發生任何事時都不能使用延遲來運行一些代碼。

+0

謝謝你的回答。正是我想知道的:) – Sondre

2

延期對象只有一次設計,即使在 延期已解決並​​讓他們被解僱後,也允許添加回調。

從你的代碼,它似乎並不清楚爲什麼你不能只是:

$("#add_user_form").submit(function(e){ 
    e.preventDefault(); 
    $.post("ajax.php", $(this).serialize()).then(function(){ 

    }, function() { 

    }); 
}); 
+0

謝謝你一個很好的答案。你在那裏發佈的代碼將會很好地完成這項工作。我詢問的原因是因爲我很好奇延遲是否也可用於處理可重複的任務,以使我的方法儘可能地類似於ajax調用。感謝偉大的答案,我現在知道我應該堅持使用$ .post或$ .ajax提交表單的舊時尚方式 – Sondre

0

我知道這是一個老話題和以前的答案是樓主的問題的完美解決方案,但我剛剛遇到了同樣的普遍問題,試圖多次解析延緩對象,所以我想分享一個解決方案。

即使以下是不可能的:

var d = $.Deferred(); 
d.done(function(text){ 
    alert('resolved ' + text); 
}); 
d.resolve('Once'); // prints resolved once 
d.resolve('Twice'); // this does nothing as done is only fired once 

您可以通過只使用進度/通知jQuery的Deferred對象的功能,而不是實現完全一樣的效果。只要做到:

var d = $.Deferred(); 
d.progress(function(text){ 
    alert('resolved ' + text); 
}); 
d.notify('Once'); // prints resolved once 
d.notify('Twice'); // prints resolved twice 

這樣,你的遞延對象從來沒有真正得到解決,但它會讓你想你火了儘可能多的異步事件調用。也許這不是用這種方式解決問題的最好的軟件設計,但我發現它對於我剛纔的情況非常有用。