3

为什么最终的控制台日志是未定义的?可变时间具有全局范围,而 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(data) {
      console.log("ko");
    }
});
     
console.log(time);  
4

3 回答 3

5

更改async为布尔值 false。

http://api.jquery.com/jQuery.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 (data) {
        console.log("ko");
    }
});

console.log(time);

另外,请注意,如果您需要在dataType: 'jsonp'此处使用跨域,您将无法同步——所以请使用 Promise。

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 在此处查看这样的示例:

演示

于 2013-08-09T15:02:10.617 回答
0

好吧,有点做作,但我希望它能说明关于范围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);

JSfiddle

于 2013-08-09T15:33:51.480 回答
0

在您的代码中,您将全局变量“时间”初始化为“数据”。这个数据变量来自哪里?如果数据变量也不是全局变量,当您尝试使用时console.log(time); ,它可能是未定义的,因为数据变量未定义。

确保两个变量都在全局范围内。那可能行得通。祝你好运!

于 2013-08-09T15:02:28.817 回答