jQuery Ajax Post - 无法使用回调函数设置全局变量?

Posted

技术标签:

【中文标题】jQuery Ajax Post - 无法使用回调函数设置全局变量?【英文标题】:jQuery Ajax Post - Unable to set global variable using callback function? 【发布时间】:2017-03-06 15:21:12 【问题描述】:

我有以下 ajax 方法。成功后我想设置一个全局变量,但它似乎不起作用 - 控制台返回空对象。仅当我将异步定义为 false 时它才有效。但是我想保持 ajax 方法异步。我怎样才能让它工作?

var appointment = ;

if ($("#Appointment").is(":checked")) 
     $.ajax(
            type: "POST",
            url: "someurl",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify(
                dateStart: moment()
            ),
           // async: false,
            dataType: "json",
            success: function(data) 
                ajaxCallBack(data);
            
    );

    function ajaxCallBack(data) 
            var response = $.parseJSON(data.d);
            appointment =  startDate: response.startDate, endDate: response.endDate ;
    


console.log(appointment);

【问题讨论】:

javascript: Global variables after Ajax requests的可能重复 ***.com/questions/14220321/… @Ted 供您参考,它一点也不懒惰。我一直在挠头并在谷歌上搜索了几个小时。如果您不想像其他人所做的那样发布任何有用的答案,那么请不要将每个问题都标记为潜在的重复问题。如果您懒得提交带有一些解释的解决方案,那么您就是懒惰的人。 @Ted 很明显,您没有花足够的时间阅读人们的 cmets,就像您懒惰提交任何有用的答案一样。我再重复一遍-在提交我自己的问题之前,我已经遇到过您提到的帖子。也许您没有意识到,将一个答案与每个问题联系起来并不总是非常清楚 - 因此为什么人们使用 *** 来获得一些额外的帮助和指导,而不是被像您这样的人贬低。 【参考方案1】:

console.log()ajaxCallback()appointment 设置之前触发(ajax 是异步的),在控制台中显示appointment 可以运行:

function ajaxCallBack(data) 
        var response = $.parseJSON(data.d);
        appointment =  startDate: response.startDate, endDate: response.endDate ;
        console.log(appointment);

function ajaxCallBack(data) 
        var response = $.parseJSON(data.d);
        appointment =  startDate: response.startDate, endDate: response.endDate ;
        printAppointment();


// define as global:
function printAppointment() 
    console.log(appointment)

【讨论】:

【参考方案2】:

Ajax 是异步发生的,这意味着在它之后出现的代码不会等待它完成。因此,您的 console.log 在 ajax 必须获得填充对象所需的内容之前执行。

尝试将您的 console.log 语句移动到回调内部 - 将其放在您设置 appointment 的行之后。

【讨论】:

@Lucas Costa - 你们是对的人。我一遍又一遍地看到这个问题,我的眼睛在欺骗我:)【参考方案3】:

ajax 是一个异步操作。所以console.log 甚至会在ajax success 之前执行。控制台来自ajaxCallBack函数的变量

function ajaxCallBack(data) 
  var response = $.parseJSON(data.d);
  appointment =  startDate: response.startDate,
                  endDate: response.endDate ;
  console.log(appointment);

【讨论】:

以上是关于jQuery Ajax Post - 无法使用回调函数设置全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

jquery $.ajax $.get $.post的区别?

jquery $.ajax $.get $.post的区别?

jquery $.ajax $.get $.post的区别?

Ajax get和post区别

jQuery与Ajax

jquery $.ajax $.get $.post的区别是啥噢?