js变量范围问题

Dev*_*rim 1 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;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

bdu*_*kes 6

data resultsresults被退回之后覆盖.

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

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});
Run Code Online (Sandbox Code Playgroud)

然后也设置asyncfalse,以便调用将阻止.

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

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

所以,而不是像这样的东西:

var results = ajax.get.venues('search');
$('#results').html(translateResults(results));
Run Code Online (Sandbox Code Playgroud)

也许是这样的:

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); 
              });
};
Run Code Online (Sandbox Code Playgroud)


Pek*_*ica 5

您的问题是JavaScript的异步特性.results 没有被覆盖,但只是到了后来,该功能后已经退出,因为当请求已完成执行回调.

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