You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery Deferred .then()传多回调数组未按文档生效,是否为Bug?

这不是jQuery的Bug,是参数格式的理解疏漏哦!

嘿,你遇到的这个情况其实是对.then()和.done()/.fail()的参数设计差异不熟悉导致的,完全不是jQuery的bug~

核心区别:参数规则不一样

  • .done()和.fail()的设计目标是批量添加回调,所以它们支持直接传入函数数组,或者多个函数参数,内部会自动遍历执行所有回调。
  • 但.then()的定位是Promise链式处理的过滤器,它的参数规则是:第一个参数是单个的成功回调函数,第二个是单个的失败回调函数,第三个是单个的进度回调函数——它并不支持直接传入函数数组作为参数。

你的代码问题出在哪?

你把成功回调包装成数组传给.then()的第一个参数,这不符合.then()的参数约定,jQuery无法识别数组形式的回调,自然不会按预期执行。

正确的处理方式

如果需要执行多个成功回调,有两种常见思路:

  1. 改用.done()处理多回调(适合不需要链式依赖的场景)

    $(() => { 
      $.Deferred().resolve('Fulfilled')
        .done([ 
          (m) => { console.log(m, 'Done Fulfilled 1') },
          (m) => { console.log(m, 'Done Fulfilled 2') }
        ]);
    })
    

    这也是你说.done()能正常工作的原因,它天生支持数组形式的回调。

  2. 用链式.then()处理顺序回调(适合需要前一个回调的返回值传递给下一个的场景)

    $(() => { 
      $.Deferred().resolve('Fulfilled')
        .then((m) => { 
          console.log(m, 'Then Fulfilled 1') 
          return $.Deferred().resolve(m).promise();
        })
        .then((m) => { 
          console.log(m, 'Then Fulfilled 2') 
          // 继续后续链式逻辑
        });
    })
    

    这种方式符合.then()的链式设计,每个.then()处理单个回调,并且可以传递Promise的状态和值。

再补个小提示

官方文档里明确标注了.then()的参数是单个的过滤函数(而非数组),而.done()的参数是一个或多个回调函数(或函数数组),这是两者从设计之初就明确的差异哦~

内容的提问来源于stack exchange,提问作者Thejaka Maldeniya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:30:28