基本上这就是我试图用伪代码做的事情:
Fetch AsyncResultA
If Success
Fetch
AsyncResultB
AsyncResultC
Either Success/Fails
Display any successful results
If Fails
Display error
这就是我在 jQuery 中所做的,但它不起作用:
$.when (
fetchA()
).then (function (data, textStatus, jqXHR) {
return {
xhrObject1: [data, textStatus, jqXHR],
xhrObject2: fetchB(),
xhrObject3: fetchC(),
xhrObject4: fetchD()
}
}, fail
).always( displayResults );
注释:
所有 fetch
函数都是 AJAX 调用。
displayResults
会获取成功获取的数据并一次性显示出来。因此,只要 fetchA
成功,就会显示一些内容。
fail
仅当 fetchA
失败时才会被调用,从而取消任何进一步的提取。
最佳答案
它不起作用,因为您没有从 .then
回调返回 promise ,而是一个普通对象。这会导致 displayResults
基本上是在 fetchA
返回的原始 Promise 上调用的。相关部分来自documentation (强调我的):
As of jQuery 1.8, the
deferred.then()
method returns a new promise [...]. These filter functions can return a new value to be passed along to the promise's.done()
or.fail()
callbacks, or they can return another observable object (Deferred, Promise, etc) which will pass its resolved / rejected status and values to the promise's callbacks.
使用$.when
并返回其返回值:
fetchA().then(function () {
return $.when([].slice.call(arguments), fetchB(), fetchC(), fetchD());
}, fail).always( displayResults );
$.when
返回一个 promise ,当传递给自身的所有 promise 都得到解决(或拒绝)时,该 promise 就得到解决。因此,如果您只向其传递一个参数,则没有理由使用 $.when
。
如果您不想在 fetchA
失败时执行 displayResults
,可以单独绑定(bind)失败处理程序:
fetchA().fail(fail).then(function () {
return $.when([].slice.call(arguments), fetchB(), fetchC(), fetchD());
}).always( displayResults );
关于javascript - 嵌套延迟调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901100/