Javascript 使用ajax设置和调用全局变量

Javascript 使用ajax设置和调用全局变量,javascript,jquery,ajax,global-variables,Javascript,Jquery,Ajax,Global Variables,我有一个返回服务器操作系统的PHP脚本的函数 这个脚本非常简单: <?php echo (strpos(PHP_OS, 'Linux') > -1 ? 'Lin' : 'Win'); 结尾的console.log输出undefined——但是如果我console.logos在success回调函数中,那么它会输出我期望的结果 据此: 我应该能够做我想与上述脚本,但它似乎不工作。如何在JavaScript/jQuery中使用ajax设置和获取全局变量?ajax操作是异步的。它

我有一个返回服务器操作系统的PHP脚本的函数

这个脚本非常简单:

<?php
    echo (strpos(PHP_OS, 'Linux') > -1 ? 'Lin' : 'Win');
结尾的
console.log
输出
undefined
——但是如果我
console.log
os
在success回调函数中,那么它会输出我期望的结果

据此:


我应该能够做我想与上述脚本,但它似乎不工作。如何在JavaScript/jQuery中使用ajax设置和获取全局变量?

ajax操作是异步的。它们不会阻止其余JavaScript的执行

函数中的最后一个
return
语句尝试立即(在AJAX操作完成之前)返回
os
。删除该
return
语句,并在成功处理程序中处理所有逻辑以将值返回给调用方

functionserveros(){
//无论发生什么情况,AJAX方法都将调用日志函数。
//但是,在AJAX调用完成之前,这不会发生。
$.ajax({
url:“../scripts/ajax/detect os.php”,
键入:“get”,
成功:功能(res){
返回值(res);
},
错误:函数(res){
警报(“重大错误!”);
返回值(res);
}
});
}
函数返回值(val){
控制台日志(val);
}
serverOS();

AJAX操作是异步的。它们不会阻止其余JavaScript的执行

函数中的最后一个
return
语句尝试立即(在AJAX操作完成之前)返回
os
。删除该
return
语句,并在成功处理程序中处理所有逻辑以将值返回给调用方

functionserveros(){
//无论发生什么情况,AJAX方法都将调用日志函数。
//但是,在AJAX调用完成之前,这不会发生。
$.ajax({
url:“../scripts/ajax/detect os.php”,
键入:“get”,
成功:功能(res){
返回值(res);
},
错误:函数(res){
警报(“重大错误!”);
返回值(res);
}
});
}
函数返回值(val){
控制台日志(val);
}
serverOS();

Scott的答案肯定有效-但我也偶然发现了一个替代方案。有一个名为
async
的AJAX属性。在我的函数中将此设置为false意味着它将成为一个同步AJAX调用。将我的函数更改为:

var os;

function serverOS()
{
    $.ajax({
        url: '../scripts/ajax/detect-os.php',
        type: 'get',
        async: false,
        success: function(res)
        {
            returnValue(res)
        },
        error: function(res)
        {
            alert('Major Error!');
            returnValue(res)
        }
    });
}

function returnValue(val)
{
    os = val;
    return os;
}

serverOS();

console.log(os); //this print Lin on my Linux machine.

ref:

Scott的答案肯定有效-但我也偶然发现了一个替代方案。有一个名为
async
的AJAX属性。在我的函数中将此设置为false意味着它将成为一个同步AJAX调用。将我的函数更改为:

var os;

function serverOS()
{
    $.ajax({
        url: '../scripts/ajax/detect-os.php',
        type: 'get',
        async: false,
        success: function(res)
        {
            returnValue(res)
        },
        error: function(res)
        {
            alert('Major Error!');
            returnValue(res)
        }
    });
}

function returnValue(val)
{
    os = val;
    return os;
}

serverOS();

console.log(os); //this print Lin on my Linux machine.


ref:

关于异步的唯一永恒问题的可能重复:)为什么不在html头中定义这个变量,而不需要服务器请求,比如var serverOS=@chebaby,因为你永远不应该混合使用PHP和JS…PHP和JS不能混合使用。一个在服务器上运行,另一个在浏览器中运行。没有混合的风险,继续吧。关于异步的唯一永恒问题是可能重复的m:)为什么不在html头部定义这个变量,而不需要服务器请求,比如var serverOS=@chebaby,因为你永远不应该混合PHP和JS…PHP和JS不能混合。一个在服务器上运行,另一个在浏览器中运行。没有风险把它们混在一起,去吧。是的。。。除了
console.log
是同步的,所以它永远不会显示操作系统类型
serverOS()
不返回任何内容,因此控制台输出将是
未定义的
。这段代码不起作用。好了,把downvote转换成upvote:)是的,因为这里显然没有可获取的实际PHP文件。但它会在你的生活中起作用project@ThisGuyHasTwoThumbs这仅仅意味着AJAX调用出错。这不是因为我的代码解决方案。这是因为您配置AJAX调用的方式不正确。@ScottMarcus只是一个简单的问题-如何将
returnValue
函数中的
val
分配给全局变量,以便在整个脚本中使用?是的。。。除了
console.log
是同步的,所以它永远不会显示操作系统类型
serverOS()
不返回任何内容,因此控制台输出将是
未定义的
。这段代码不起作用。好了,把downvote转换成upvote:)是的,因为这里显然没有可获取的实际PHP文件。但它会在你的生活中起作用project@ThisGuyHasTwoThumbs这仅仅意味着AJAX调用出错。这不是因为我的代码解决方案。这是因为您配置AJAX调用的方式不正确。@ScottMarcus只是一个简单的问题-如何将
returnValue
函数中的
val
分配给全局变量,以便在整个脚本中使用?不,实际上这会让您回到开始的地方。
console.log()
将在调用
serverOS()
之后立即执行,然后才有机会完成AJAX调用。你不能指望这项技术。您可以/应该只从AJAX调用的成功处理程序中访问返回值,或者至少通过
null
检查来访问返回值。是的,可能是这样,但是“it works for me”是web开发中最糟糕的四个词。您的结果可能会被缓存,从而导致AJAX调用返回得非常快,速度足够快,以便在遇到
console.log()
时填充
os
变量。但是,无法知道每个用户完成AJAX调用所需的时间。@ScottMarcus在私有窗口中测试…:我知道你是从哪里来的,但是它在私有窗口(缓存被禁用)中仍然有效,“它有效”不是使用AJ的正确标准