如何确保两个AJAX请求按预期顺序依次执行?
问题分析与解决方案
你遇到的问题核心在于:requestUtilisateurEdit 虽然加了 async 关键字,但内部并没有等待AJAX请求完成就返回了,导致 .then(requestGroupeEdit) 会立即执行第二个请求,两个请求变成并行状态,自然可能出现第二个先完成的情况。
为什么原代码不生效?
async 函数的特性是:如果内部没有 await 异步操作,也没有返回一个 Promise/Deferred 对象,它会直接返回一个已完成状态的 Promise,此时 .then 里的逻辑会立刻触发,完全不会等待内部的AJAX请求结束。
两种可行的修复方案
方案一:用 async/await 改造第一个函数
直接在 requestUtilisateurEdit 里等待AJAX请求完成,同时用 try/catch/finally 替代原来的 done/fail/always:
async function requestUtilisateurEdit() { urlAPI = baseURL + "/utilisateur/" + idUtilisateurURL; try { // 等待AJAX请求完成 const output_success = await $.ajax({ type: "GET", url: urlAPI, dataType: "json", contentType: "application/json", headers: { Entreprise: sousdomaine, }, }); let result = output_success.result; if (result == 0) { setAlert("danger", "Pas d'utilisateur trouvé") } else { utilisateur = output_success.utilisateur; } } catch (http_error) { setAlert("danger", http_error.statusText); } finally { $("#loader").hide(); } }
之后你的调用方式不变:
requestUtilisateurEdit().then(requestGroupeEdit);
方案二:返回AJAX的 Deferred 对象
jQuery的 $.ajax 返回的是 Deferred 对象(兼容Promise),只要让 requestUtilisateurEdit 返回这个对象,就能保证 .then 在第一个请求完成后才执行:
function requestUtilisateurEdit() { urlAPI = baseURL + "/utilisateur/" + idUtilisateurURL; let requestUtilisateurEdit = $.ajax({ type: "GET", url: urlAPI, dataType: "json", contentType: "application/json", headers: { Entreprise: sousdomaine, }, }); requestUtilisateurEdit.done(function(output_success) { let result = output_success.result; if (result == 0) { setAlert("danger", "Pas d'utilisateur trouvé") } else { utilisateur = output_success.utilisateur; } }); requestUtilisateurEdit.fail(function(http_error) { setAlert("danger", http_error.statusText); }); requestUtilisateurEdit.always(function() { $("#loader").hide(); }); // 关键:返回Deferred对象 return requestUtilisateurEdit; }
调用方式同样不变:
requestUtilisateurEdit().then(requestGroupeEdit);
两种方案都能确保第一个请求完全完成(无论成功或失败)后,才启动第二个请求。
内容的提问来源于stack exchange,提问作者easymoneysniper23
相关产品推荐
相关产品推荐

