我有一种情况需要从jQuery AJAX调用的结果初始化/分配变量,然后在脚本上进一步重用这些变量:
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 = "...";
我遇到的两个问题:
redirectFlag
布尔值,data.rows[0].redirectFlag
是获取变量值的正确方法吗?和shouldRedirect
初始化为什么(如何说“创建变量但不给它一个值!”)?提前致谢!
答案 0 :(得分:1)
您只需执行以下操作即可声明未初始化的变量:
var shouldRedirect;
如果您的逻辑需要它,您当然可以将其初始化为false:
var shouldRedirect = false;
这可能不是你想要的。您可以通过严格地将变量与undefined
进行比较来检查变量是否已初始化:
if (shouldRedirect === undefined) // do something
但请注意,您必须使用三等号运算符(也就是严格相等),否则您的结果将不会如预期的那样。另一方面,未定义的变量将产生错误的结果。这意味着当使用简单的if (shouldRedirect)
检查变量并且变量未定义时,它将产生false
,就像它被设置为false一样。对于JavaScript中的其他几个值也是如此,例如空字符串""
或值null
。您可以看到完整的值假名列表here。如果要明确检查true或false并想要省略其他falsy或truthy值,则应检查三次相等,例如if (shouldRedirect === true)
。
此外,如果data.rows[0].redirectFlag
是访问该值的正确方法,则高度依赖于您从AJAX调用接收的数据结构的实际情况。如果它类似于以下内容则是正确的:
{ rows: [ {redirectFlag: true}, {redirectFlag: false} ] }
如果你的JSON看起来像以下那样
{ redirectFlag: false }
然后您只需使用data.redirectFlag
访问redirectFlag。
答案 1 :(得分:0)
在AJAX启动之前我应该如何初始化shouldRedirect(如何创建变量但不给它一个值!)?
您可以这样做:var shouldRedirect;
但是,我会var shouldRedirect = false;
确保shouldRedirect未定义
取决于您从AJAX请求发回的内容。通常响应是JSON,所以如果你发送一个值为true的JSON对象,那么你可以这样做:
shouldRedirect = data.redirectFlag;
答案 2 :(得分:0)
对于第1部分声明一个带有值的变量使用: var shouldRedirect。这样你就可以做一个if(!shouldRedirect){}。
对于第2部分。如何从redirectFlag获取值是基于从ajax调用返回的数据的形成。数据......将是您获得价值的起点。
答案 3 :(得分:0)
正如评论部分所述,设置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或更高版本,则可以通过Promises/A使用defered object实现。 Deferred对象允许您在操作完成时执行一个或多个函数,并使异步代码更易于阅读。
$.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.
}