each()函数内多AJAX调用:jQuery.when参数传递方式咨询
关于jQuery.when处理数组中多个AJAX请求的参数问题
嘿,这个问题问得特别实用!很多人第一次用$.when处理批量AJAX请求时都会踩这个坑,我来给你掰扯清楚:
核心结论
不能直接把包含3个AJAX调用的数组作为单个参数传给$.when,你需要把数组里的每个请求拆成独立参数传入,不过不用手动一个个写call1、call2、call3,用语法糖就能轻松搞定。
为什么不能直接传数组?
$.when的设计是接受多个独立的Deferred/Promise对象作为参数,如果你直接传一个数组,它会把这个数组当成一个普通的非Deferred值,直接触发done回调,根本不会等待数组里的AJAX请求完成——这完全不是你想要的效果!
正确的两种写法
假设你已经通过循环把3个GET请求的Deferred对象存在了calls数组里:
var calls = []; // 循环构建AJAX请求,把每个$.get的返回值(Deferred)push进数组 calls.push($.get('/api/data1')); calls.push($.get('/api/data2')); calls.push($.get('/api/data3'));
写法1:ES6扩展运算符(简洁推荐)
用...把数组直接展开成独立参数,这是ES6之后最清爽的写法:
$.when(...calls) .done(function(res1, res2, res3) { // 所有请求成功完成后执行 // 每个res参数是对应AJAX的响应结果、状态文本、jqXHR对象的集合 console.log('第一个请求结果:', res1[0]); console.log('所有请求都完成啦!'); }) .fail(function() { // 只要有一个请求失败,就会进入这里 console.error('至少一个请求出错了'); });
写法2:apply方法(兼容旧浏览器)
如果你需要兼容ES6之前的老浏览器,就用apply来把数组转换成参数列表:
$.when.apply($, calls) .done(function() { // 这里可以用arguments来获取所有响应结果 var responses = Array.from(arguments).map(function(args) { return args[0]; // 提取每个请求的实际响应数据 }); console.log('所有响应数据:', responses); }) .fail(function() { console.error('请求出错'); });
额外提示:循环里的注意点
在forEach或者jQuery的each循环里构建calls数组时,记得要把每个AJAX请求的返回值(也就是$.get/$.ajax返回的Deferred对象)push进去,而不是只执行AJAX调用却不存返回值——只有存下Deferred对象,$.when才能跟踪每个请求的状态。
内容的提问来源于stack exchange,提问作者Shailesh Jaiswal
相关产品推荐
相关产品推荐

