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

如何将JSON响应结果存入变量?AJAX异步请求返回值问题求助

解决异步请求返回值无法存储的问题

你遇到的核心问题是异步操作的执行顺序:$.post是异步HTTP请求,函数moodleEmail会在请求发送后立刻执行完毕,而.done()里的代码要等服务器返回响应后才会运行。所以你在.done()里写的return,根本不会把值赋值给id_mdl——因为这时候id_mdl = moodleEmail(...)已经执行完了,moodleEmail本身默认返回的是undefined。

下面是三种可行的解决思路:

方案1:使用回调函数

修改moodleEmail,让它接受一个回调函数作为参数,当异步请求完成拿到数据后,调用这个回调把值传出去:

const url_moodle = "https://xxxxx/xxxxx/app/appmoodlejson.php";

var moodleEmail = function (email, callback){
  $.post( url_moodle, { "email":email, "postvar":"email" }, "json")
    .done(function( data, textStatus, jqXHR ) {
      if(data.data){
        callback(data.data.id_mdl);
      }
    })
    .fail(function( jqXHR, textStatus, errorThrown ) {
      toastr.error('Error, contact support');
      if ( console && console.log ) {
        console.log( "Fail response: " +  textStatus);
      }
    });
};

// 使用时
moodleEmail('someemail@emailsome.com', function(id) {
  var id_mdl = id;
  // 在这里写需要用到id_mdl的代码
});

方案2:返回Promise对象

jQuery的AJAX方法本身就返回Promise,所以可以直接返回这个Promise,然后用.then()处理结果:

const url_moodle = "https://xxxxx/xxxxx/app/appmoodlejson.php";

var moodleEmail = function (email){
  return $.post( url_moodle, { "email":email, "postvar":"email" }, "json")
    .done(function( data, textStatus, jqXHR ) {
      if(data.data){
        return data.data.id_mdl;
      }
    })
    .fail(function( jqXHR, textStatus, errorThrown ) {
      toastr.error('Error, contact support');
      if ( console && console.log ) {
        console.log( "Fail response: " +  textStatus);
      }
      throw errorThrown; // 抛出错误让外部可以捕获
    });
};

// 使用时
moodleEmail('someemail@emailsome.com')
  .then(function(id) {
    var id_mdl = id;
    // 在这里处理id_mdl
  })
  .catch(function(err) {
    // 处理错误
  });

方案3:使用async/await语法

这是更简洁的写法,需要把moodleEmail改成async函数,然后用await等待请求完成:

const url_moodle = "https://xxxxx/xxxxx/app/appmoodlejson.php";

var moodleEmail = async function (email){
  try {
    const data = await $.post( url_moodle, { "email":email, "postvar":"email" }, "json");
    if(data.data){
      return data.data.id_mdl;
    }
  } catch (error) {
    toastr.error('Error, contact support');
    if ( console && console.log ) {
      console.log( "Fail response: " +  error.statusText);
    }
    throw error;
  }
};

// 使用时,必须在async函数里调用
async function getMoodleId() {
  var id_mdl = await moodleEmail('someemail@emailsome.com');
  // 在这里使用id_mdl
}

getMoodleId();

内容的提问来源于stack exchange,提问作者Dixander Carballo Buque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:15:04