Выполните асинхронный вызов перед вызовом функции - PullRequest
1 голос
/ 29 февраля 2012

У меня есть функция authenticate (), которая использует $ post () для получения ключа сеанса с моего сервера. Я считаю, что $ post - это асинхронный вызов. Всякий раз, когда я выполняю какие-либо действия в своем скрипте, я хочу убедиться, что у меня есть sessionKey, а если у меня нет sessionKey, я хочу authenticate (). Моя проблема в том, как мне запустить executeTask () после того, как я вызвал authenicate ()?

function foo() {
    if (sessionKey) {
        performTask();
    } else {
        authenciate();
        performTask();
    }
}

function authenticate() {       
    $.post(url, function(data) {
        sessionKey = data.sessionKey;
    });
}

РЕДАКТИРОВАТЬ: Я также не хочу помещать в функцию обратного вызова authenticate () executeTask (), так как authenticate () будет вызываться из нескольких различных функций.

Ответы [ 4 ]

2 голосов
/ 29 февраля 2012

Передайте обратный вызов самой authenticate(), используя интерфейс Promise jQuery (см. документация ):

function authenticate(callback) {
    var rq = $.post(url, function(data) {
        sessionKey = data.sessionKey;
    });

    if(callback) {
        rq.success(callback);
    }
}

Теперь просто позвоните, например, authenticate(performTask).

1 голос
/ 29 февраля 2012

Вы можете передать обратный вызов методу аутентификации. Если аутентификация вызывается из 20 разных мест, вы можете передать 20 разных методов обратного вызова.

function foo() {
    if (sessionKey) {
        performTask();
    } else {
        authenciate(function() {
           performTask();
        });
    }
}

function authenticate(callback) {       
    $.post(url, function(data) {
        sessionKey = data.sessionKey;
        if (callback) callback();
    });
}
0 голосов
/ 29 февраля 2012

Проверьте этот вопрос: Как я могу заставить jQuery выполнять синхронный, а не асинхронный Ajax-запрос?

У него есть пример синхронного выполнения AJAX. Обычно вы передаете параметр async:false, и вам может потребоваться использовать метод ajax() вместо ярлыка post().

Обновление:

Еще одна вещь, которую вы можете сделать, это обернуть все это в функцию, такую ​​как:

function foo() {
    authenciate(function() {
       performTask();
    });
}

function authenticate(callback) {     

    if (!callback) { return; }

    if (sessionKey) {
        callback();
    } else {
        $.post(url, function(data) {
            sessionKey = data.sessionKey;
            callback();
        });
    }
}
0 голосов
/ 29 февраля 2012

AJAX-вызовы JQuery имеют функции обратного вызова (успех и ошибка). Вы можете передать действие после аутентификации в качестве обратного вызова, чтобы выполнить его после завершения аутентификации.

Кроме того, вы можете установить опцию am, чтобы звонки были синхронными.

Извините за отсутствие ссылки на документацию; Я пишу с моего телефона. Просто поищите документацию в Google "jquery.ajax".

* РЕДАКТИРОВАТЬ: * В качестве ответа на ваше редактирование вы можете дать своему методу аутентификации параметр для использования в качестве функции обратного вызова, если вы хотите изменить то, что происходит после вызова (или ничего не делать), в в каждом конкретном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...