0

我正在尝试做一个简单的调用,从 $.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()上面代码中 s 的输出:

  1. in namespace
  2. in startCall()
  3. in finishCall()
  4. in ajax succeeded call
  5. in finishCall()

为什么最后一个变量设置为“infinishCall()”而不是“in ajax succeeded call”?

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

太感谢了!

4

3 回答 3

0

你的成功回调函数

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

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

        } else { }

    }

你有一个无效的request变量,因为你的函数C作为输入数据

于 2012-07-09T22:37:52.763 回答
0

所以,当你接收到数据时,运行。叫做:

GetSongInfoSucceeded(data);

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

function GetSongInfoSucceeded(C) {

然后我们看到,“数据”的输入现在将在 var 中调用C。这就是为什么打电话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 { }
}
于 2012-07-09T22:38:30.167 回答
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 在调用 last 之前不会等待 $.ajax 调用成功alert。当它发生时,价值仍然是in finishCall()

令我困惑的是,为什么alert如您所说,这是最后显示的,而不是最后显示的;console.log'ajax 成功调用'实际上显示在最后。

于 2012-07-09T22:54:03.473 回答