2013-10-17 93 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');