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

如何确保两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:08:14