2

我有一种情况,我需要从 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 = "...";

我遇到的两个问题:

  • 假设生成的 JSON 将包含一个redirectFlag布尔值,data.rows[0].redirectFlag获取我的变量值的正确方法是什么?和
  • 在启动 AJAX 之前我要初始化什么shouldRedirect(我怎么说“创建一个变量但还没有给它一个值!”)?

提前致谢!

4

4 回答 4

1

您可以通过简单地执行以下操作来声明未初始化的变量:

var shouldRedirect;

如果您的逻辑需要它,您当然可以将其初始化为 false:

var shouldRedirect = false;

不过,这可能不是您想要的。您可以通过严格比较变量来检查变量是否已初始化undefined

if (shouldRedirect === undefined) // do something

但请注意,您必须使用三等号运算符(也称为严格相等),否则您的结果将与预期不符。另一方面,未定义的变量将产生错误的结果。这意味着当使用 simple 检查变量if (shouldRedirect)并且该变量未定义时,它将 yield false,就好像它被设置为 false 一样。这也适用于 JavaScript 中的其他几个值,例如空字符串""或值null您可以在此处查看虚假值的完整列表。如果你想明确地检查真假,并想省略其他假或真值,那么你应该检查三重相等,例如if (shouldRedirect === true)

此外,是否data.rows[0].redirectFlag是访问该值的正确方法很大程度上取决于您从 AJAX 调用收到的数据结构的实际外观。如果它类似于以下内容,那将是正确的:

{ rows: [ {redirectFlag: true}, {redirectFlag: false} ] }

如果您的 JSON 如下所示

{ redirectFlag: false }

然后你必须简单地访问 redirectFlag data.redirectFlag

于 2012-05-02T11:12:16.660 回答
0
  • 在 AJAX 启动之前我应该​​初始化什么(我怎么说“创建一个变量但不给它一个值!”)?

    你可以这样做:var shouldRedirect;

但是,我会var shouldRedirect = false;确保 shouldRedirect 不是未定义的

  • data.rows[0].redirectFlag 是获取变量值的正确方法吗?

取决于您从 AJAX 请求发回的内容。通常响应是 JSON 格式,所以如果你返回一个值为 true 的 JSON 对象,那么你可以这样做:

shouldRedirect = data.redirectFlag;
于 2012-05-02T11:13:07.793 回答
0

对于第 #1 部分,声明一个具有值的变量,使用:var shouldRedirect。这样您就可以执行 if (!shouldRedirect) {}。

对于第 2 部分。如何从redirectFlag中获取值是根据ajax调用返回的数据形成的。data... 将是您获得价值的起点。

于 2012-05-02T11:14:53.457 回答
0

如评论部分所述,设置shouldRedirect标志不会有帮助,因为请求之后的if语句$.ajax将在从服务器获取结果之前进行评估 - 这是异步代码执行中面临的常见问题。虽然理论上您可以通过参数强制 jQuery.ajax 进入同步模式sync,但我不建议这样做,因为它会在发出请求时锁定浏览器 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 或更高版本,您可以通过defered object使用它们的Promises/A实现。延迟对象允许您在操作完成时执行一个或多个函数,并使异步代码更易于阅读。

$.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.
}
于 2012-05-02T11:39:42.120 回答