Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ajax调用中的Scope变量_Javascript_Ajax - Fatal编程技术网

Javascript ajax调用中的Scope变量

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

为什么最终控制台日志未定义?变量时间具有全局范围,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);  

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()
-提示(承诺),这对我来说是新的!;-)