2010-09-14 160 views
1

我如何使数据覆盖结果变量?js变量范围问题

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

不是范围问题。您需要了解异步代码和回调是如何工作的。见例如。 http://stackoverflow.com/questions/2021114/javascript-jquery-variables-not-giving-expected-values,http://stackoverflow.com/questions/1092563/scope-of-variable-in-javascript-problem for其他人陷入同一陷阱。 – bobince 2010-09-14 15:26:11

回答

6

data覆盖results,刚过results已返回。

可以使用ajax函数而不是getJSON,因为getJSON仅仅是

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

速记,然后也设置asyncfalse,使调用将阻塞。

但是,在你的情况下,这将无法正常工作,因为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); 
       }); 
}; 
5

你的问题是JavaScript的异步性质。 results确实被覆盖,但只有在函数已经退出后才会被覆盖,因为当请求结束时执行回调。

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

3

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

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

$.getJSON("http://x.com/some.php?term="+search+"&callback=?", JSON_handler); 
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 :) 
}) 

函数式编程可能很有趣。