jQuery无法在.ajax()调用后保留数据

时间:2012-07-09 22:33:07

标签: jquery ajax function variables

我正在尝试进行一个简单的调用,我从$ .ajax()获取数据,并希望将其保存到一个全局变量中,我可以在调用ajax调用的函数中使用它。

为什么没有设置变量?为什么我设置的值会丢失?

jQuery.support.cors = true;

$.myNamespace = {
    timerID: "in namespace"
};

$(document).ready(function () {
    $("#btnSkip").click(function () {
        alert($.myNamespace.timerID);
        startCall();
    });

    function startCall() {
        $.myNamespace.timerID = "in startCall()";
        alert($.myNamespace.timerID);
        finishCall();
        alert($.myNamespace.timerID);
    }

    function finishCall() {
        $.myNamespace.timerID = "in finishCall()";
        alert($.myNamespace.timerID);

        $.ajax({
            type: "GET",
            url: getUrl,
            processData: false,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                $.myNamespace.timerID = "in ajax succeeded call";
                alert($.myNamespace.timerID);
            },
            error: function (xhr, status, error) {
                GetSongInfoFailed(xhr, status, error);
            }
        });
    }

    function GetSongInfoFailed(xhr, status, error) {
        alert('Service call failed: ' + xhr + ' ' + status + ' ' + error);
    }


});

上述代码中alert()的输出:

  1. in namespace
  2. in startCall()
  3. in finishCall()
  4. in ajax succeeded call
  5. in finishCall()
  6. 为什么最后一个变量设置为“in finishCall()”而不是“in ajax succeeded call”?

    注意,我不是jQuery或javascript专家。

    非常感谢你!

3 个答案:

答案 0 :(得分:0)

您的成功回调功能

 function GetSongInfoSucceeded(C) {
        if (result != null) {

            $.myNamespace.timerID = "in ajax succeeded call";
            alert($.myNamespace.timerID);

        } else { }

    }

您有一个无效的request变量,其中您的函数获取C作为输入数据

答案 1 :(得分:0)

所以,当你收到数据时,功能。被称为:

GetSongInfoSucceeded(data);

如果我们查看你的函数定义:

function GetSongInfoSucceeded(C) {

然后我们看到,“数据”的输入现在将在名为C的var内部。这就是为什么调用result不会给你任何答案:

        if (result != null) {

            $.myNamespace.timerID = "in ajax succeeded call";
            alert($.myNamespace.timerID);

        } else { }

正确的方式是这样的:

function GetSongInfoSucceeded(result) {
    if (result != null) {
        $.myNamespace.timerID = "in ajax succeeded call";
        alert($.myNamespace.timerID);
    } else { }
}

答案 2 :(得分:0)

这不是保存数据的问题 - 它实际上是执行顺序的问题。让我们再次检查你的代码,这次用函数的实际代码替换finishCall()调用:

alert($.myNamespace.timerID);

$.myNamespace.timerID = "in finishCall()";
alert($.myNamespace.timerID);

$.ajax({..., ..., function() {     
  $.myNamespace.timerID = "in ajax succeeded call()";
  alert($.myNamespace.timerID);
});

alert($.myNamespace.timerID);

请参阅,JS在调用最后一个alert之前不会等待$ .ajax调用成功。如果是,则值仍为in finishCall()

让我感到困惑的是,正如你所说,alert显示为最后一个,而不是最后一个;使用console.log'ajax success call'会显示最后一个。