我正在学习使用 jQuery Deferred,并且正在考虑链接多个 deferred。这是我的问题的简化版本:
var def1 = $.ajax(...); // ajax call 1
var def2 = null, def3 = null;
$.when(def1)
.then(function() {
def2 = $.ajax(...); // ajax call 2
return def2;
}).then(function() {
def3 = $.ajax(...); // ajax call 3
return def3;
});
然后在上面代码下面的某个地方,我有:
$.when(def1, def2, def3)
.then(function() {
// run some code... .e.g. run foo();
});
上面的代码是错误的。它不能做我想做的事。我的实际意图基本上是:
我想先运行 ajax 调用 1。
如果 ajax 调用 1 成功,则运行 ajax 调用 2。(这将是一个额外的奖励:如果 ajax 调用 1 不成功和/或其返回的结果未通过我的手动验证,则提醒用户并运行一些代码,例如 bar()。)
如果 ajax 调用 2 成功,则运行 ajax 调用 3。(同样的奖励适用)
然后我想仅在 def3 已解析时运行一些代码(例如 foo() )。在运行 foo() 之前,我实际上并不关心 def1 和 def2 是否已解析。 (如果 def3 被拒绝,如果可能的话,我也想运行另一段代码。)
我一开始无法初始化def2(ajax call 2)和def3(ajax call 3)的原因是我想根据ajax调用1的返回结果来修改ajax调用2的选项。 ajax 调用 3 的方式相同,具体取决于 ajax 调用 2 的结果。
以我有限的知识和对deferred的理解,上面的代码基本上不能产生我想要的结果。
因为 def1 在 def2 初始化和触发之前就已解析,所以底部的代码将在 def2 启动之前太早运行 foo()...
所以,我寻求帮助和建议。看看是否有人知道如何重写上面的代码并使其按照我上面写的意图运行。我为我的无能感到抱歉。
提前谢谢大家。
最佳答案
您不需要使用 when
,当您想要并行运行多个延迟时,使用它确实更好。试试这个:
var d1 = $.ajax(...);
var d2 = d1.then(function () {
if (invalid) {
return $.Deferred().reject("Invalid");
}
return $.ajax(...);
});
var d3 = d2.then(function () {
if (invalid) {
return $.Deferred().reject("Invalid");
}
return $.ajax(...);
});
d3.done(function () {
// This is called when we're all done.
});
可以简化为:
$.ajax(...).then(function () {
if (invalid) {
return $.Deferred().reject("Invalid");
}
return $.ajax(...);
}).then(function () {
if (invalid) {
return $.Deferred().reject("Invalid");
}
return $.ajax(...);
}).done(function () {
// This is called when we're all done.
})
// Use this to handle failure. You can also add to individual
// deferred objects to handle each failure differently.
.fail(function () {
// Do something.
});
要处理失败,您可能需要在 then
中添加另一个回调:
.then(function () {
if (invalid) {
return $.Deferred().reject("Invalid");
}
// Do stuff
}, function (err) {
})
关于javascript - 通过更新 then() 内的延迟来链接 jQuery 延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42644956/