Javascript 如何跨函数使用和重用JS变量
我的情况是,我需要根据jQuery AJAX调用的结果初始化/分配变量,然后在脚本中进一步重用这些变量:Javascript 如何跨函数使用和重用JS变量,javascript,jquery,html,Javascript,Jquery,Html,我的情况是,我需要根据jQuery AJAX调用的结果初始化/分配变量,然后在脚本中进一步重用这些变量: var shouldRedirect = ??? $.ajax({ url: 'http://example.com', type: 'GET', data: 'blah', asynch: false, timeout: 1800, success: function(data) { shouldRedirect = dat
var shouldRedirect = ???
$.ajax({
url: 'http://example.com',
type: 'GET',
data: 'blah',
asynch: false,
timeout: 1800,
success: function(data) {
shouldRedirect = data.rows[0].redirectFlag
}
});
if(shouldRedirect)
window.location = "...";
我有两个问题:
- 假设生成的JSON将包含一个
boolean,即redirectFlag
获取我的变量值的正确方法是什么?;及data.rows[0]。redirectFlag
- 在AJAX启动之前,初始化
应该重定向到什么位置(如何说“创建一个变量,但不要给它赋值!”)
提前谢谢 只需执行以下操作,即可声明未初始化的变量:
var shouldRedirect;
如果您的逻辑需要,您当然可以将其初始化为false:
var shouldRedirect = false;
这可能不是你想要的。通过将变量与未定义的进行严格比较,可以检查变量是否已初始化:
if (shouldRedirect === undefined) // do something
但是请注意,必须使用三重相等运算符(也称为严格相等),否则结果将不符合预期。另一方面,未定义的变量将产生错误的结果。这意味着,当使用简单的if(shouldRedirect)
检查变量时,如果该变量未定义,那么它将产生false
,就像它被设置为false一样。JavaScript中的一些其他值也是如此,例如空字符串“”
或值null
。您可以看到falsy值的完整列表。如果要显式检查true或false,并且要忽略其他falsy或truthy值,则应使用三重相等进行检查,例如If(shouldRedirect==true)
另外,如果data.rows[0].redirectFlag
是访问该值的正确方法,则该值在很大程度上取决于从AJAX调用接收的数据结构的实际外观。如果类似于以下内容,则是正确的:
{ rows: [ {redirectFlag: true}, {redirectFlag: false} ] }
如果您的JSON看起来像下面这样
{ redirectFlag: false }
然后您只需使用数据访问redirectFlag。redirectFlag
- 在AJAX启动之前,初始化应该重定向到什么(如何说“创建一个变量,但不要给它赋值!”)
您可以这样做:
var shouldRedirect代码>
然而,我会做var shouldRedirect=false代码>以确保shouldRedirect未定义
- data.rows[0].redirectFlag是获取变量值的正确方法吗
取决于从AJAX请求返回的内容。通常响应是JSON格式的,因此,如果返回值为true的JSON对象,则可以执行以下操作:
shouldRedirect = data.redirectFlag;
对于第1部分,要声明具有值的变量,请使用:
var应该重定向。这样,您就可以执行if(!shouldRedirect){}
第二部分。如何从redirectFlag获取值取决于ajax调用返回的数据的形成。数据。。。将是您获取值的起点。如评论部分所述,设置shouldRedirect
标志没有帮助,因为$后面的if
语句将在从服务器获取结果之前对ajax
请求进行评估-这是异步代码执行中面临的常见问题。虽然从理论上讲,可以通过sync
参数强制jQuery.ajax进入同步模式,但我不建议这样做,因为它会在发出请求时锁定浏览器UI
您需要将重定向代码移动到$函数中。ajax
success
函数如下:
$.ajax({
url: 'http://example.com',
// ... other options omitted for brevity
success: function(data) {
// This code block gets executed when the operation completes.
var shouldRedirect = data.rows[0].redirectFlag
if (shouldRedirect) {
// Your redirection code goes here.
window.location = "...";
}
}
});
如果您使用jQuery 1.7或更高版本,可以通过使用它们的实现。延迟对象允许您在操作完成时执行一个或多个函数,并使异步代码更易于阅读
$.ajax({ url: 'http://example.com' })
.done(function(data) {
// This code block gets executed when the operation completes.
});
除了将函数闭包传递给done
,还可以传递对成员函数的引用,例如:
$.ajax({ url: url }).done(onDataLoaded);
function onDataLoaded(data) {
// This function gets called when the ajax operation completes.
}
您的asynch
属性错误,它应该是async
。如果请求是异步的,这永远不会起作用,因此您需要更改它。@jamesalardice:我认为这很好。同步请求无论如何都是不好的:)@ThiefMaster-同意,它们是不好的,但在这种情况下,这是执行OP尝试执行的操作的唯一方法(在success
事件处理程序之外使用AJAX请求返回的值)。@ThiefMaster,这里的具体问题是if(shouldRedirect)[…]
将在ajax调用返回之前执行,因此不会实际执行任何操作。因此,虽然异步操作确实是正确的处理方式,但这段代码只在同步模式下工作。是的,但他更应该将代码放在处理程序中。