jQuery中$.when函数未触发内部逻辑直接跳转.then回调问题求解
问题根本原因
$.when() 要求接收的参数是 jQuery Deferred/Promise 类型对象,你当前直接把一个函数定义作为参数传给了$.when(),没有主动调用这个函数,导致两个问题:
- 函数内部的所有逻辑(包含
console.log、条件判断、Ajax请求)完全不会执行,因为这个函数从始至终没有被触发运行 $.when()会把传入的普通函数对象判定为「非Deferred类型的已完成值」,直接触发后续的.then()回调,这就是你看到then先执行、内部逻辑无响应的核心原因。
附带逻辑问题
你代码中if分支的返回逻辑也存在错误:
return dfd.resolve();
dfd.resolve()的返回值是undefined,不是Deferred对象,就算你调用了函数,if分支返回的非Deferred值也会让$.when()直接触发then,不会按照预期等待逻辑执行完成,正确写法是先修改Deferred状态再返回Deferred本身:
dfd.resolve() return dfd
修复方案
把传入$.when()的匿名函数改为立即执行函数,也就是在函数定义末尾加(),让函数立刻执行并把返回的Deferred/ ajax对象传给$.when()即可:
$.when((function() { // 原有内部逻辑保持不变 })()).then(function() { // 原有then回调逻辑保持不变 })
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

