Не могу установить правильные глобальные переменные - PullRequest
0 голосов
/ 30 марта 2011

Я пытаюсь сохранить токен в глобальной переменной. Когда оповещение запускается, оно говорит о нуле, но если я ставлю 2 оповещения одно за другим, первое показывает ноль, а второе показывает токен.

Это похоже на то, что токен не установлен, потому что 1-е предупреждение запускается до того, как запрос 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;
        }
    });
}

Спасибо

ОБНОВЛЕНО

Хорошо, спасибо за вашу помощь всем, но до сих пор не понимаю, как это будет работать. Я использую get_csrf_token () как jqgrid для отправки токена с запросом, как показано ниже. Так как мне передать токен и заставить его работать?

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

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Функция обратного вызова успешно запускается при получении ответа 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);
        }
    });
}
2 голосов
/ 30 марта 2011

A в AJAX означает «асинхронный». Пока вы нажимаете на первое оповещение, AJAX-запрос выполняется, и значение заполнено. Вам нужно будет поместить весь код, которому нужна переменная csrf_token, в вашу функцию обратного вызова. В качестве альтернативы, вы можете использовать jQuery 1.5 или выше (если вы этого еще не сделали). Он имеет так называемые отложенные объекты

Этот 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;
    }
});

Это заставит браузер дождаться ответа, прежде чем продолжить работу с остальным кодом. Я не обязательно рекомендую это, но это должно работать.

2 голосов
/ 30 марта 2011

AJAX-запрос является асинхронным.Это означает, что сценарий не ждет его завершения.Когда срабатывает первое оповещение, токен не установлен.Но пока вы не нажмете OK, у него будет время для загрузки, и токен будет установлен.

Вот порядок операций:

  1. вызов get_csrf_token
  2. makeзапрос токена
  3. показать предупреждение 1
  4. завершить запрос и установить csrf_token
  5. клиент нажимает OK при первом предупреждении
  6. показать предупреждение 2 (переменная токенабыл установлен на 4.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...