javascript - 嵌套延迟调用

标签 javascript jquery jquery-deferred

基本上这就是我试图用伪代码做的事情:

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/

相关文章:

javascript - 如何在 x 时间后无响应时取消 ajax 请求或第三方 js 请求 w/abort()

javascript - 在 JavaScript 中,如何将多个数组转换为 HTML 表并在 for 循环 JSON 对象时打印它们

javascript - 使用ES6表示法中的filter()方法解析一维数组

javascript - 包含标签的字符串在 <td> 内无法正确呈现

javascript - jQuery 每个函数在每次点击时显示不同的弹出窗口

javascript - 初始化时jquery数据表设置宽度

javascript - while 循环内的延迟方法

javascript - $.getJSON 没有将数据保存到全局变量/对象中,该变量/对象是本地的

jquery - 聚焦并将光标置于 contenteditable div 的末尾

javascript - jQuery When Done 动态拉取函数调用