2010-09-14 209 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 :) 
}) 

函數式編程可能很有趣。