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

jQuery $.when.apply未按预期工作:无法等待所有请求完成再执行函数

问题分析与解决方案

嘿,我一眼就看到了代码里的关键问题——你在使用数组的push方法时用错了语法!

核心错误:数组push的语法错误

你写的是:

deferreds.push[add(data)];

但正确的数组push调用应该是括号而不是方括号:

deferreds.push(add(data));

同样的错误出现在edit和delete的分支里。

这个错误会导致什么呢?因为方括号的写法根本不会往deferreds数组里添加任何元素,你的数组始终是空的。而$.when()在传入空数组的时候会立即resolve,这就是为什么后续的函数会被过早调用的原因!

修正后的完整代码

function update(changes) {
    var deferreds = [];
    // 必须遍历changes并发起单独请求
    for(var i = 0; i < changes.length; i++) {
        var direction = changes[i]['direction'];
        var data = changes[i]['data'];
        if(direction == 'add') {
            deferreds.push(add(data)); // 这里改成括号!
        } else if(direction == 'edit') {
            deferreds.push(edit(data)); // 这里也是!
        } else if(direction == 'delete') {
            deferreds.push(delete(data)); // 还有这里!
        }
    }
    return $.when.apply($, deferreds);
}

额外检查点

除了语法错误,还要确保你的add、edit、delete函数确实返回了jQuery Deferred对象,比如它们内部的AJAX请求要正确return出去:

function add(data) {
    // 一定要return $.ajax的结果,它本身就是Deferred对象
    return $.ajax({
        url: '/your-add-url',
        method: 'POST',
        data: data
    });
}

如果这些函数没有返回Deferred对象,deferreds数组里的元素就不是可等待的异步对象,$.when同样会提前结束。

这样修改之后,$.when.apply($, deferreds)就会正确等待所有异步请求完成,再触发后续的函数啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:17:36