【发布时间】:2013-11-29 12:59:48
【问题描述】:
我正在使用一个使用 jQuery Deferred Objects 的框架。
在我的代码中,一个异步操作应该成功执行,以便执行另一个异步操作。
function doOperation() {
var def2mock = $.Deferred();
var def1 = doSomeAsyncOperation().done(function () {
var def2 = doAnotherAsyncOperation();
});
return $.when(def1, def2mock);
}
所以我将第二个操作的调用放在第一个操作的延迟的“完成”承诺中,如示例中所示。
现在,我用函数doOperation 包装这个序列。 doOperation 的结果应该是两个异步调用的两个延迟的连接。意思是 doOperation 如果所有异步操作都成功则成功,如果其中任何一个操作失败则失败,这正是 $.when 所做的。
问题是为了创建与$.when 的连接,我需要在调用$.when 时同时存在两个延迟。并且由于此时第二个异步操作的延迟不可用,我不得不先找到一种方法来创建连接,然后将第二个异步操作的延迟添加到连接中稍后。
为此,我想我可以在doOperation 中定义一个名为def2 的新mock $.Deferred。当真正的def2 准备好时,我可以以某种方式链接真正的延迟到模拟的,即使真实的状态与模拟的同步。我发现的唯一方法是做
def2.done(def2mock.resolve)
// and
def2.fail(def2mock.reject)
但我不认为这种手动链接是正确的方法。
所以请告诉我你是否有更好的建议来正确地做这件事。
【问题讨论】:
-
其实应该是def2.then(def2mock.resolve,def2mock.reject,def2mock.notify)
-
下面的人不会这样做吗:
return doSomeAsyncOperation().then(doAnotherAsyncOperation())? -
没有内引号,也许
-
@Noseratio,在对
.then的概念和@FelixKling 的fitlers 有了更好的理解之后,我说你的建议确实有效。谢谢。 -
@HasanBaidoon,没问题。您可能想阅读Q Library 上的文档,它与 jQuery 承诺兼容。我觉得这是一本非常全面的阅读材料。
标签: javascript jquery asynchronous deferred