如何在函数two(依赖one执行)与three的AJAX请求完成后执行操作?
解决方案
这事儿用jQuery的Promise机制就能轻松搞定——因为$.ajax()本身会返回一个带Promise特性的jqXHR对象,我们可以用它来跟踪请求状态,再配合$.when()来等待多个请求全部完成。具体操作如下:
- 先修改
two()和three(),让它们返回内部AJAX请求的jqXHR对象,这样我们能拿到请求的状态引用。 - 在
one()的AJAX完成回调里,同时启动two()和three()的请求,用$.when()监听这两个请求的完成状态,当两者都成功结束后,再执行你需要的后续操作。
修改后的完整代码示例:
function one(){ $.ajax({ url:'url' }) .done(function(res){ // 启动two和three的请求,获取它们的Promise实例 const twoRequest = two(); const threeRequest = three(); // 等待两个请求都完成 $.when(twoRequest, threeRequest) .done(function(twoResult, threeResult){ // 这里写两个请求都完成后要执行的操作 console.log("two和three的AJAX请求都完成啦!"); console.log("two请求的返回结果:", twoResult[0]); console.log("three请求的返回结果:", threeResult[0]); }) .fail(function(){ // 如果任意一个请求失败,会进入这里,可按需处理错误 console.log("有一个请求失败了"); }); }) } function two(){ // 返回AJAX请求的jqXHR对象(自带Promise能力) return $.ajax({ url:'url' }) } function three(){ // 返回AJAX请求的jqXHR对象(自带Promise能力) return $.ajax({ url:'url' }) }
补充说明
$.when()可以接收多个Promise对象,只有当所有对象都进入成功状态(resolved)时,才会触发done()回调;如果有任意一个请求失败(rejected),会直接进入fail()回调。- 在
done()的回调函数里,参数顺序和传入$.when()的请求顺序一致,每个参数是一个数组,包含请求的返回数据、状态文本、jqXHR对象,所以用twoResult[0]就能直接拿到two()里AJAX的返回内容。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

