我基本上需要的是在實際創建之前公開一個Deferred。例如,假設我有一些對象,它是包裝一個Ajax查詢,但它開始之前,它需要揭露遞延,表示查詢的分辨率:包裝jQuery的模式推遲到另一個延期?
var object = new AjaxRunningThing();
// Get a Deferred wrapping the Ajax operation
var ajaxResult = object.getAjaxResult();
// Later...
// Now the object is going to initiate the Ajax request
object.startAjax();
現在我只是手動鏈接起來,使的「真正的」遞延分辨率鏈接到「門面」之一:
// in getAjaxResult()
var publicDeferred = $.Deferred();
// in startAjax()
var privateDeferred = $.ajax(...);
privateDeferred.then(
function() { publicDeferred.resolve.apply(this, arguments); },
function() { publicDeferred.reject.apply(this, arguments); }
);
我不能不認爲有更好的方式來做到這一點,雖然。
- 編輯---
有關它的更多,我要找的是一個真正的代理思考 - 搜索「代理」使我這個職位,其中描述了我在尋找並且包括一個更好的(雖然還沒有完全透明)的解決方案:Propagating events between JQuery.Deferred objects
我不明白這一點,如果AJAX調用返回延期對象,在同一時間用相同的參數解決? – adeneo
因爲在發生ajax調用之前,有一些其他組件會要求它 - 這裏的延遲是「將在無限期內發生的一些Ajax調用」 – Adam
您的解決方案很好 - Q promise中有更多巧妙的解決方案,但jQuery的承諾是_really_光禿禿的骨頭和基本的。 –