2013-10-17 94 views
-1

我想在jquery函數外部使用一些變量,但我無法使它們成爲全局變量。我已經按照第一個'var'的建議,然後分配它們,但最後一個log()返回未定義。jquery全局變量失敗

var lat,lon; 
$.get('ip.json',function(data) { 
    var loc=data['loc']; 
    lat=loc.split(',')[0]; 
    lon=loc.split(',')[1]; 
    },'json'); 
console.log(lat,lon); 

更新這裏是完整的代碼

var lat,lon; 
$.get('ip.json',function(data) { 
    console.log(data); 
    var city=data['city']; 
    var loc=data['loc']; 
    lat=loc.split(',')[0]; 
    lon=loc.split(',')[1]; 
    $('body').append(' '+city+' '+lat+' '+lon); 
    },'json'); 
console.log(lat,lon); 
$.get('apiurl?lat='+lat+'&lon='+lon+'&callback=test',function(data) {},'json'), 
+4

'$ .get()'是異步的。 'console.log()'行在ajax回調函數之前執行。 –

+0

使用'$ .ajax()'並使其與'async:false'同步 – Brewal

+1

@Brewal我曾說過,我會再說一遍,'async:false'永遠不會是答案。 –

回答

0

的問題是你發出異步調用,它返回調用console.log了。您需要在回調中包含console.log才能正常工作。

var lat,lon; 
$.get('ip.json',function(data) { 
    var loc=data['loc']; 
    lat=loc.split(',')[0]; 
    lon=loc.split(',')[1]; 
    console.log(lat,lon); 
    },'json'); 
+1

我在外面需要它/ global /以後不在裏面 –

+2

您將不得不查看異步編程模型。您需要利用上述的回撥,然後適當地爲您撥打電話。您仍然可以分配全局變量,但您需要確保變量具有首先分配給它們的值! –

+1

您不能使用此方法本身指定「稍後」。然而,你可以做的是設置另一個函數,當你收到成功的返回時觸發你的console.log,但在處理異步請求時,腳本中的「稍後」並不等於「以後」。 –

0

更進一步,上述傢伙說我相信你可以使一個AJAx調用異步。這裏有How to make JQuery-AJAX request synchronous

+4

但是無論你做什麼......避免在* synchronous *模式下實際使用Ajax。這導致了黑暗的一面。學習如何使用異步操作。 –

+2

您可以/使/使AJAX調用同步,但請記住,這也將成爲一個阻塞調用...在該調用返回之前,不會執行其他腳本,因此您處於遠程服務器+延遲的擺佈之中,以確保您的腳本繼續執行任何其他職責。 –

+0

我應該補充一點,謝謝。 –

0

你可以用一下AJAX ASYC調用

$.ajax({ 
    async: "false", 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     url: "uri", 
     success: function(data) { 
      var loc=data['loc']; 
      lat=loc.split(',')[0]; 
     lon=loc.split(',')[1]; 
     } 
    }); 
console.log(lat,lon); 
+3

我認爲你的意思是同步(同步),而不是異步(異步),但我強烈建議你*不要使用Ajax同步模式*,而是學會使用異步操作。 –

+0

你不應該把'async'屬性設置爲'false'。學習使用回調和承諾對象... – War10ck

1

鑑於你的新代碼,一個簡單的解決辦法是嵌套調用:

$.get('ip.json', function (data) { 
    console.log(data); 
    var city = data['city']; 
    var loc = data['loc']; 
    var lat = loc.split(',')[0]; 
    var lon = loc.split(',')[1]; 
    $('body').append(' ' + city + ' ' + lat + ' ' + lon); 
    $.get('apiurl?lat=' + lat + '&lon=' + lon + '&callback=test', function (data) { 
     //handle second response here 
     console.log(lat, lon); 
    }, 'json'); 
}, 'json'); 
1

鑑於您需要更新的代碼掛起所有依賴AJAX呼叫結果的邏輯處理器:

var lat, lon; 
$.get('ip.json', function(data) { 
    console.log(data); 
    var city = data['city']; 
    var loc = data['loc']; 
    lat = loc.split(',')[0]; 
    lon = loc.split(',')[1]; 
    $('body').append(city + ' ' + lat + ' ' + lon); 

    // at this point you now have the data for your second AJAX call: 
    console.log(lat,lon); 
    $.get('apiurl?lat=' + lat + '&lon=' + lon + '&callback=test', function(data){  
     // do something 
    },'json'), 
},'json');