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

如何等待AJAX的success回调执行完成后再获取返回对象?

问题原因

AJAX属于异步操作,addUserLayerTreemail函数执行时不会等待AJAX请求及后续回调逻辑执行完成,会直接运行到函数结束,默认返回undefined。你将return userLayer写在success回调内部,这个返回值只会作用于success回调本身,无法被外层的addUserLayerTreemail函数捕获,所以赋值给myLayer的自然就是undefined。


解决方案

方案1:回调函数传值

给addUserLayerTreemail新增一个回调参数,在所有异步逻辑执行完成后调用回调,把处理好的userLayer传出去。
修改后的函数定义:

addUserLayerTreemail(userLayer, callback) {
  let configData = {"searchText": "search", "searchType" : "treemail"};
  $.ajax({
    url: "../apis/mySearch",
    method: 'GET',
    dataType: 'json',
    data : configData,
    success: response => {
      userLayer.query().where(response).run((data) => {
        userLayer.add(data);
        // 所有数据处理完成后调用回调传值
        callback(userLayer);
      });
    }
  });
}

调用方式:

// 所有需要用到myLayer的逻辑都放在回调函数内部
this.addUserLayerTreemail(userLayer, (myLayer) => {
  console.log(myLayer);
  // 后续业务逻辑写在这里
});

方案2:Promise封装(更推荐)

把整个异步逻辑封装成Promise返回,后续可以灵活使用then或者async/await取值。
修改后的函数定义:

addUserLayerTreemail(userLayer) {
  // 对外返回Promise实例
  return new Promise((resolve) => {
    let configData = {"searchText": "search", "searchType" : "treemail"};
    $.ajax({
      url: "../apis/mySearch",
      method: 'GET',
      dataType: 'json',
      data : configData,
      success: response => {
        userLayer.query().where(response).run((data) => {
          userLayer.add(data);
          // 异步处理完成后触发resolve传值
          resolve(userLayer);
        });
      }
    });
  })
}

调用方式1:用then接收结果

this.addUserLayerTreemail(userLayer).then(myLayer => {
  console.log(myLayer);
  // 后续业务逻辑写在这里
});

调用方式2:如果环境支持async/await,代码更简洁

// 注意:这段调用代码所在的外层函数必须加async关键字
async function yourBusinessFunction() {
  const myLayer = await this.addUserLayerTreemail(userLayer);
  console.log(myLayer);
  // 后续可以直接使用myLayer
}

内容的提问来源于stack exchange,提问作者Ian Bell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 06:36:03