Javascript ajax调用中的Scope变量
为什么最终控制台日志未定义?变量时间具有全局范围,ajax调用是异步的 这是我的代码:Javascript ajax调用中的Scope变量,javascript,ajax,Javascript,Ajax,为什么最终控制台日志未定义?变量时间具有全局范围,ajax调用是异步的 这是我的代码: var time; $.ajax({ async: false, type: 'GET', url: "http://www.timeapi.org/utc/now.json", success: function(data) { console.log(data); time=data; }, error: function
var time;
$.ajax({
async: false,
type: 'GET',
url: "http://www.timeapi.org/utc/now.json",
success: function(data) {
console.log(data);
time=data;
},
error: function(data) {
console.log("ko");
}
});
console.log(time);
将
async
更改为布尔值false
var时间;
$.ajax({
async:false,
键入:“GET”,
url:“http://www.timeapi.org/utc/now.json",
成功:功能(数据){
控制台日志(数据);
时间=数据;
},
错误:函数(数据){
控制台日志(“ko”);
}
});
console.log(时间);
另外,请注意,如果您需要在这里为跨域使用数据类型:“jsonp”
,您将无法同步,所以请使用承诺
var time;
$.ajax({
dataType: 'jsonp',
type: 'GET',
url: "http://www.timeapi.org/utc/now.json",
success: function (data) {
time = data;
},
error: function (data) {
console.log("ko");
}
})
.then(function(){ // use a promise to make sure we synchronize off the jsonp
console.log(time);
});
使用Q.js查看如下示例:
在代码中,将全局变量“time”初始化为“data”。这个数据变量来自哪里?如果数据变量也不是全局变量,当您尝试使用
console.log(time)时代码>,它可能未定义,因为数据变量未定义
确保这两个变量都在全局使用的范围内。那可能行得通。祝你好运 好的,有点做作,但我希望它能说明时间的范围和计时的要点
$.ajax({
async: false,
dataType: 'jsonp',
type: 'GET',
url: "http://www.timeapi.org/utc/now.json",
success: function (data) {
console.log(data.dateString);
time = data.dateString;
},
error: function (data) {
console.log("ko");
}
});
window.setTimeout("console.log('time: '+time)",3000);
应该是async:false
(没有引号)我不确定:您是否能够在get
-模式下使用ajax
连接到外部URL?浏览器安全性是否仅限制对本地URL的访问?@cars10-签出@EricHotinger So,只要发送和接收页面位于http://www.timeapi.org
它会工作,否则类型
需要设置为'JSONP'
,对吗?数据只是ajax callIf的返回值data
是一个字符串,您可以。但是,如果您的服务器使用JSON对象进行响应,那么数据将是一个对象,由jQuery为您生成。赋值将只指向对象。数据的内容
不会复制到时间
-变量中,而是保留在函数的本地范围内。正如jQuery.ajax页面中的提示:跨域请求和数据类型:“jsonp”请求不支持同步操作。添加了一个使用Q.js的示例来说明这一点。谢谢@jnatazia。。。。另一方面的注释是:console.log(time)代码>可能会在Ajax成功函数()返回某些内容之前触发。是的,这就是承诺的目的。查看更新的演示。@EricHotinger感谢then()
-提示(承诺),这对我来说是新的!;-)