基本上,我需要的是在实际创建 Deferred 之前公开它。例如,假设我有一些包装了 Ajax 查询的对象,但在它开始之前它需要公开一个表示该查询解析的 Deferred:
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); }
);
不过,我不禁认为有更好的方法可以做到这一点。
- 编辑 - -
仔细想想,我正在寻找的实际上是一个代理——搜索“代理”让我找到了这篇文章,它描述了我正在寻找的内容,并包含了一个更好的(尽管仍然不是完全透明的)解决方案:传播JQuery.Deferred 对象之间的事件