Как инициировать другой вызов jQuery .ajax на основе результата первоначального вызова .ajax? - PullRequest
0 голосов
/ 20 марта 2009

У меня есть вызов jQuery .ajax:

$j.ajax({
    type: "POST",
    url: "/Services/Cart.asmx/UpdateQuantity",
    data: data,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        var d = msg.d;
        // etc.
    },
    error: function(xhr, msg) {
        var response = JSON.parse(xhr.responseText);
        var cart = $j('#cart');
        if (response.Message) {
            cart.before('<div class="error">' + response.Message + '</div>');
        } else {
            cart.before(' <div class="error">An unexpected error occurred.</div> ');
        }
    },
    complete: function(request, settings) {
        // Some other stuff.
    }

}); // end ajax
alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.');

Однако, основываясь на некоторых данных, возвращаемых этим первым вызовом ajax, я хочу инициировать второй вызов .ajax. Тем не менее, похоже, что из-за того, как обратные вызовы настроены для первого, это не происходит последовательно (то есть, где в приведенной выше строке последнего предупреждения («Первоначально ...»)), поэтому я не могу использовать последние обновленные данные DOM на стороне клиента.

Как лучше отправить еще один вызов .ajax? Я быстро провел несколько тестов в рамках всего мероприятия, но это не показалось.

У меня здесь сидит "jQuery в действии", ожидая, что я найду время, чтобы покопаться в нем, чтобы понять больше того, что происходит под капотом, но пока нет времени!

ОБНОВЛЕНИЕ: Эрк. Когда очевидное сначала не работает, как ожидалось, проблема обычно лежит между стулом и монитором; Я положу это на всю ночь пердеть мозг. Оказывается, как я изначально настроил его (вызов второго .ajax-вызова в обратном вызове успеха), очевидно, был правильным, но мой второй .ajax-вызов содержал небольшую синтаксическую ошибку (и, таким образом, потерпел неудачу и отправил меня неправильно) ).

И @kgiannakakis отмечается как ответ, потому что он / она был а) первым и б) при условии, что он умело недооценен: «Вы можете настроить вызов на синхронность, но это не рекомендуемая техника».

Ответы [ 2 ]

3 голосов
/ 20 марта 2009

Если вы хотите сделать еще один ajax-запрос, основанный на результате первого, у вас, вероятно, должен быть второй ajax-запрос в другой функции. Эта другая функция будет вызываться при успешном событии первого ajax-запроса. Примерно так, хотя я не проверял это, чтобы убедиться, что это правильно:

$j.ajax({
    type: "POST",
    url: "/Services/Cart.asmx/UpdateQuantity",
    data: data,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: newSuccessFunction(xhr,msg),
    error: function(xhr, msg) {
        var response = JSON.parse(xhr.responseText);
        var cart = $j('#cart');
        if (response.Message) {
            cart.before(' <div class="error">' + response.Message + '</div> ');
        }
        else {
            cart.before(' <div class="error">An unexpected error occurred.</div> ');
        }
    },
    complete: function(request, settings) {
        // Some other stuff.
    }

}); // end ajax

function newSuccessFunction(xhr,msg) {
    var d = msg.d;
    //... etc.
    $.ajax({ //...
           });
    alert('Initially thought this would be called after above .ajax call complete. But it is not. Rather, it is called before success etc.')
}
2 голосов
/ 20 марта 2009

Ну, предупреждение должно отправляться при успешном обратном вызове, а не после вызова ajax. Поведение Ajax-вызовов по умолчанию является асинхронным. То есть вызов немедленно возвращается, а обратные вызовы вызываются в какой-то момент позже, когда данные фактически получены.

Вы можете настроить вызов на синхронность, но это не рекомендуемый метод.

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