使用母版页时jQuery $.when失效问题求助
问题分析与解决方案
这问题我之前也碰到过,核心原因是你的masterPageFunction没有返回一个能被$.when识别的异步操作对象,导致$.when直接认为它已经完成了,所以提前执行了webFormFunction。
你的masterPageFunction里虽然嵌套了两个AJAX请求,但函数本身没有返回任何值,$.when接收的是undefined,自然会立刻触发done回调。下面给你两种可行的修改方案:
方法1:用Promise链式调用(推荐,更符合现代JS写法)
把嵌套的AJAX改成链式的then调用,让函数返回最终的Promise对象,这样$.when就能正确追踪所有异步操作的完成状态:
function masterPageFunction() { // 第一个AJAX请求,返回Promise return $.ajax({ type: "POST", url: "/api/master/xxx/", data: JSON.stringify(obj), contentType: "application/json; charset=utf-8", dataType: "json" }).then(function(response) { // 第一个请求完成后,发起第二个AJAX,同样返回Promise return $.ajax({ type: "POST", url: "/api/master/xxx2/", data: JSON.stringify(obj), contentType: "application/json; charset=utf-8", dataType: "json" }); }); }
你的Web窗体代码不需要修改,保持原逻辑即可:
$(document).ready(function(){ $.when(masterPageFunction()).done(function(){ webFormFunction(); }); })
方法2:用jQuery Deferred对象
如果习惯使用老的Deferred写法,也可以手动创建一个Deferred实例,在最后一个AJAX请求完成后手动resolve它:
function masterPageFunction() { var defer = $.Deferred(); $.ajax({ type: "POST", url: "/api/master/xxx/", data: JSON.stringify(obj), contentType: "application/json; charset=utf-8", dataType: "json", success: function (response) { $.ajax({ type: "POST", url: "/api/master/xxx2/", data: JSON.stringify(obj), contentType: "application/json; charset=utf-8", dataType: "json", success: function (response) { // 第二个AJAX完成后,标记Deferred为已完成 defer.resolve(); }, error: function() { // 处理错误,避免Deferred一直处于等待状态 defer.reject(); } }) }, error: function() { defer.reject(); } }); // 返回Deferred的promise对象,外部只能监听状态,不能修改 return defer.promise(); }
额外提醒
不管用哪种方法,都建议加上错误处理逻辑,避免某个AJAX请求失败后,done回调永远不会执行:
$(document).ready(function(){ $.when(masterPageFunction()) .done(function(){ webFormFunction(); }) .fail(function(){ console.log("母版页AJAX请求失败,请检查接口或参数"); }); })
内容的提问来源于stack exchange,提问作者user3001046
相关产品推荐
相关产品推荐

