Javascript 使用ajax设置和调用全局变量
我有一个返回服务器操作系统的PHP脚本的函数 这个脚本非常简单: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
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的正确标准