jQuery Deferred .then()传多回调数组未按文档生效,是否为Bug?
这不是jQuery的Bug,是参数格式的理解疏漏哦!
嘿,你遇到的这个情况其实是对.then()和.done()/.fail()的参数设计差异不熟悉导致的,完全不是jQuery的bug~
核心区别:参数规则不一样
.done()和.fail()的设计目标是批量添加回调,所以它们支持直接传入函数数组,或者多个函数参数,内部会自动遍历执行所有回调。- 但
.then()的定位是Promise链式处理的过滤器,它的参数规则是:第一个参数是单个的成功回调函数,第二个是单个的失败回调函数,第三个是单个的进度回调函数——它并不支持直接传入函数数组作为参数。
你的代码问题出在哪?
你把成功回调包装成数组传给.then()的第一个参数,这不符合.then()的参数约定,jQuery无法识别数组形式的回调,自然不会按预期执行。
正确的处理方式
如果需要执行多个成功回调,有两种常见思路:
改用
.done()处理多回调(适合不需要链式依赖的场景)$(() => { $.Deferred().resolve('Fulfilled') .done([ (m) => { console.log(m, 'Done Fulfilled 1') }, (m) => { console.log(m, 'Done Fulfilled 2') } ]); })这也是你说
.done()能正常工作的原因,它天生支持数组形式的回调。用链式
.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
相关产品推荐
相关产品推荐

