似乎无法正确设置全球变量

时间:2011-03-30 11:55:56

标签: javascript jquery ajax

我正在尝试将令牌存储到全局变量中。当警报运行时,它表示为null,但如果我一个接一个地发出2个警报,则第一个显示为null,但第二个显示令牌。

就像没有设置令牌一样,因为在ajax请求完成之前运行了第一个警报。

有没有人对我做错了什么有任何想法?

var csrf_token = null;

$(document).ready(function(){
    get_csrf_token();
    alert('token 1 '+csrf_token);
    alert('token 2 '+csrf_token);
});

function get_csrf_token()
{
    $.ajax({
        type: "GET",
        url: "http://buscore/index.php/includes/csrf_token/",
        dataType: "json",
        success: function(resp, status) {
            if (resp.status != 'success')
            {
                alert('Error - Update CSRF Token\n\n' + resp.status);
                return;
            }

            csrf_token = resp.csrf_token;
        }
    });
}

由于

已更新

好的感谢大家的帮助,但仍然没有看到这是如何工作的。我使用像jqgrid这样的get_csrf_token()来发送带有如下请求的令牌。那么如何将令牌传递给它并让它工作呢?

beforeRequest: function (){
        get_csrf_token()
        //alert(csrf_token);
        $("#customer_grid").setPostDataItem('<?php echo $csrf_token_name; ?>', csrf_token);
    }

3 个答案:

答案 0 :(得分:5)

成功回调函数在HTTP响应到达时运行。

在测试中,响应在第一个警报显示的时间和单击按钮以使脚本继续运行之间到达。

对回调中的数据执行任何操作,而不是作为启动Ajax请求的语句之后的语句。

评论要求的示例:

$(document).ready(function(){
    get_csrf_token();
});

function get_csrf_token()
{
    $.ajax({
        type: "GET",
        url: "http://buscore/index.php/includes/csrf_token/",
        dataType: "json",
        success: function(resp, status) {
            if (resp.status != 'success')
            {
                alert('Error - Update CSRF Token\n\n' + resp.status);
                return;
            }

            alert('token 1 '+csrf_token);
            alert('token 2 '+csrf_token);
        }
    });
}

答案 1 :(得分:2)

AJAX请求是异步的。这意味着脚本不会等待它完成。当第一个警报触发时,未设置令牌。但是在你点击OK之前它有时间加载并且令牌将被设置。

以下是操作的顺序:

  1. 致电get_csrf_token
  2. 制作令牌请求
  3. show alert 1
  4. 完成请求并设置csrf_token
  5. 客户端在第一次提醒
  6. 时点击确定
  7. 显示警报2(令牌变量设置为4。)

答案 2 :(得分:2)

AJAX中的A代表“异步”。当您忙于单击第一个警报时,AJAX请求将通过并填充值。您需要将需要变量csrf_token的所有代码放入回调函数中。或者,您可以考虑使用jQuery 1.5或更高版本(如果您还没有)。它有所谓的Deferred Objects

  

此API允许您使用可能不会立即出现的返回值(例如异步Ajax请求的返回结果)。

您还可以将帖子请求的async值设置为false,如下所示:

$.ajax({
    type: "GET",
    async: false,
    url: "http://buscore/index.php/includes/csrf_token/",
    dataType: "json",
    success: function(resp, status) {
        if (resp.status != 'success')
        {
            alert('Error - Update CSRF Token\n\n' + resp.status);
            return;
        }

        csrf_token = resp.csrf_token;
    }
});

这将使浏览器在继续执行其余代码之前等待响应。我不一定会推荐它,但它应该有用。