如何将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
相关产品推荐
相关产品推荐

