js变量范围问题

时间:2010-09-14 15:21:21

标签: javascript jquery

如何使数据覆盖结果变量?

var ajax = {
    get : {
        venues : function(search){
            var results = "@";
            $.getJSON("http://x.com/some.php?term="+search+"&callback=?",function(data){ results = data; });
            return results;
        }
    }
};

4 个答案:

答案 0 :(得分:6)

data返回后,

results 覆盖results

您可以使用ajax功能代替getJSON,因为getJSON只是

的缩写
$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

然后还将async设置为false,以便通话阻止。

但是,在您的情况下这不起作用,因为JSONP请求("?callback=?")不能同步。

另一个(更好)选项是让任何代码依赖于results回调调用的success返回值。

所以,而不是像这样:

var results = ajax.get.venues('search');
$('#results').html(translateResults(results));

也许是这样的:

ajax.get.venues('search', function (results) {
    $('#results').html(translateResults(results));
});

venues = function (search, callback) {
    $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
              function(data){
                  callback(data); 
              });
};

答案 1 :(得分:5)

您的问题是JavaScript的异步特性。 results 会被覆盖,但只能在函数退出后才被覆盖,因为请求完成后会执行回调。

您必须使用sync: true使Ajax调用同步(这通常不是一个好主意,只是为了完整性而提及它)或重构您的代码流,因此它不依赖于{{1不再有价值,但你需要做的一切都是在回调函数中完成的。

答案 2 :(得分:3)

这不是范围问题。这是因为$.getJSON是异步的;在results完成之前返回$.getJSON。尝试为$.getJSON进行回调,以便在完成后调用。

function JSON_handler(data){
    // do stuff...
}

$.getJSON("http://x.com/some.php?term="+search+"&callback=?", JSON_handler);

答案 3 :(得分:3)

您可以将要运行的逻辑放在回调中。

    var ajax = {
      get : {
        venues : function(search, fnCallback){
            var results = "@";
            $.getJSON("http://x.com/some.php?term="+search+"&callback=?",
                function(data){ 
                    // success
                    results = data; 
                    (typeof fnCallback == 'function') && fnCallback(data);
                });
            return results;
        }
    }
};

ajax.get.venues(term, function(result){
    // Do stuff with data here :)
})

函数式编程很有趣。