Ajax和范围问题

时间:2014-03-05 22:45:41

标签: javascript ajax

我在使用AJAX和数据范围方面遇到了一些问题。我是Javascript的新手,我不确定如何解决我的问题。

  var urlList = new Array();
  $.ajax({
      url: "http://localhost:3000/url",
      success: function(data) {
         alert(data.expressions.url); //This shows the correct result
         urlList[0] = obj.expressions.dom;
      }
  });

  alert(urlList[0]); //this shows undefined

我需要urlList[0]中的数据,以便我以后可以使用它。我认为这是一个范围问题。

有人能指出我正确的方向吗?

由于

2 个答案:

答案 0 :(得分:3)

这不是范围问题,而是时间问题。 ajax方法是异步执行的。这意味着调用它不会导致程序等到它完成。这导致在请求完成之前显示警报。

要解决此问题,请将请求放在成功函数中。这是处理请求结果的适当位置。

var urlList = new Array();

$.ajax({
    url: "http://localhost:3000/url",
    success: function(data) {

        alert(data.expressions.url); //This shows the correct result

        urlList[0] = obj.expressions.dom;

        // This might work now, depending on what `obj.expressions.dom` is. This
        // isn't becoming clear from your code. Usually you would use the `data`
        // parameter of the success function, which contains the response body of
        // the ajax request that has just finished.
        alert(urlList[0]);

        // of course you can call other functions as well. For instance, you 
        // could call
        urlListChanged();
        // ..which you can declare in global scope. This way, you can repond to 
        // changes  from multiple sources, without having to duplicate code.
        // It will all work, as long as you use the success handler as the trigger.
    }
});


function urlListChanged()
{
   alert(urlList[0]);
}

答案 1 :(得分:1)

你的问题是按时间顺序排列的。

$.ajax触发异步请求,这意味着代码之后的其余代码将在请求解决之前继续执行。由于urlList仅在请求结算后填充,因此您的提醒过早发生。

更改

$.ajax...

var req = $.ajax...

并将警报包装成成功回调:

req.done(function() { alert(urlList[0]); });

...或者只是在现有的success回调中移动提醒。