Javascript $.getJSON终于被激发了

Javascript $.getJSON终于被激发了,javascript,jquery,ajax,json,twitter-bootstrap,Javascript,Jquery,Ajax,Json,Twitter Bootstrap,在我的点击事件中,我试图打开一个引导模式。Modal有一些值,我正试图使用getJSON从ajax调用中获取这些值。问题是,当jQuery函数结束时,getJSON最后被激发 这是我的密码: $('.poplinks').popover().parent().on('click', '.insert-submission', function () { var baKey = 8701; var obj; $.getJSO

在我的点击事件中,我试图打开一个引导模式。Modal有一些值,我正试图使用getJSON从ajax调用中获取这些值。问题是,当jQuery函数结束时,getJSON最后被激发

这是我的密码:

$('.poplinks').popover().parent().on('click', '.insert-submission', function () {
            var baKey = 8701;
            var obj;

            $.getJSON('/urltogetobjectwithvalue/', {id: baKey}, function (result) {
                debugger; //it comes here at last after modal('show') executes
                obj = result;
            });

            debugger; //first it come here
            $("#span_unk_sub_baid").html(baKey);
            if (obj !== undefined)
                $("#span_unk_sub_baid").append(' Eff Date: ' + obj.EffectiveDate);

            $('#dialog_ins_purc').modal('show'); //now it will go to $.getJSON
        });

我想展示我从JSON调用中得到的一些值。加载模态后,它将获取值。如何确保json调用按照我想要的顺序进行。请帮助。

不要使用速记

$.ajax({
    type:'GET',
    async:false,
    url:"your url",
    dataType:'JSON',
    data:{id,baKey}
    success:function(result)
    {
      debugger;obj = result;
    }
});

Async默认设置为true。因此,js在这次ajax调用后执行代码,不会等待服务器返回响应。如果设置为false,js将等待服务器返回数据并继续执行。

JavaScript是一种事件驱动语言,这意味着它可以异步工作

Ajax—是以异步方式访问服务器的方式

像getJSON这样的函数使用AJAX以异步方式工作——这意味着,在从服务器获得结果之前,它不会阻塞整个脚本——在这种情况下,它会启动一个操作,从服务器请求一个资源,并接收一个函数,每当发生某个事件时(在这种情况下,请求到达服务器时)调用该函数,通常称为回调它的结束-即,您从服务器获得响应

如果它按照您想象的方式工作,则无需像您那样传递函数,您可以编写:

obj = $.getJSON('/urltogetobjectwithvalue/', {id: baKey}); //WRONG CODE - DON'T USE IT
关于Javascript中使用setTimeout的异步编程,有一个很好的解释,setTimeout在Javascript中也可以异步工作

为了使事情按我想你想要的顺序进行,你应该做如下事情:

$('.poplinks').popover().parent().on('click', '.insert-submission', function () {
    var baKey = 8701;
    var obj;

    function afterResponse(){
        $("#span_unk_sub_baid").html(baKey);
        if (obj !== undefined)
            $("#span_unk_sub_baid").append(' Eff Date: ' + obj.EffectiveDate);
        $('#dialog_ins_purc').modal('show');
    }

    $.getJSON('/urltogetobjectwithvalue/', {id: baKey}, function (result) {
        obj = result;
        afterResponse();
    });
});

不,它会在您调用它时立即启动,但是由于AJAX异步Javascript和XML是异步的,您猜到了,它会在等待响应时继续执行代码,因此它会在您的服务器响应时首先调用回调,这是在您的浏览器完成匿名函数的其余部分之后。将获得结果后要执行的代码放入回调函数result anonymous函数中,这样就可以了。可能重复的代码请注意,这样做的原因是使用async:false?-1,使用同步请求将锁定UI,有更好的方法可以解决这个问题。你建议我应该使用什么?如果你想在从服务器获得结果后发生什么事情,它应该放在回调函数内部或从回调函数调用的另一个函数中。我已经用examplefunction afterResponse编辑了答案,它应该在click事件内部,或者我可以将它放在外部?baKey变量只存在于函数内部,因此它必须在click处理程序内部-如果要取出它,还需要取出baKey。同样适用于obj变量,但与tobaKey相反,您可以通过向afterResponse回调发送结果参数来轻松忽略obj。我是否可以将baKey和obj作为参数传递给afterResponse回调,如afterResponseobj,baKey?