Дождитесь окончания ДВУХ асинхронных функций, прежде чем запускать третью (jQuery Deferred?)

Я пытаюсь понять Deferred jQuery, но, несмотря на примеры, я не могу добиться того, чего хочу.

Итак, я хотел бы вызвать 2 функции асинхронно, и, когда ОБЕ завершены, вызвать еще одну.

Вот мой код

function1();
function2();

function3();

function1() и function2() делают ajax-вызов моему приложению ASP.NET, и они отлично работают. Они должны быть завершены до начала function3().

Я читаю снова и снова документацию, но function3() не ждет конец двух других. Не могли бы вы предоставить мой образец, чтобы я понял Deferred? Мне очень нужно, чтобы они закончили важную часть моего проекта.

Большое тебе спасибо.


БОНУСНЫЙ ВОПРОС

Я читал об .when deferred... Можно написать в каком-то элементе <div> что-то вроде выполняется функция1(), затем выполняется функция2() и т.д...?

ОБНОВЛЕНИЕ

Подробнее о function1() и function2(): Они очень похожи, вот их тело:

function function1() {
    return $.ajax({
        url         :   "@Url.Action("MyMethod", "MyController")",
        contentType :   "application/json; charset=utf-8",
        dataType    :   "json"
    }).done(function(data) { 
        $.each(data, function(index) {
            pushDatas(data[index]);
        })
    }).fail(function (result) {
        alert("function1failed");
    });
}

function pushDatas(data)
{
    if(!($.inArray(data, loadedDatas) !== -1)) {
        loadedDatas.push(data);
    }
}

ОБНОВЛЕНИЕ 2

Функции вызываются так:

<script type="text/javascript">
    $(document).ready(function () {
        //some others asynchrounous functions

        $.when(function1(), function2()).done(function3("test"));
    }

    ...

</script>

person AlexB    schedule 07.10.2013    source источник
comment
на ваш бонусный вопрос, зачем вам это? консоль — гораздо лучшее место для такого рода информации, если вы действительно не хотите, чтобы ваш конечный пользователь увидел ее.   -  person Kevin B    schedule 08.10.2013
comment
Хм, цель состояла в том, чтобы написать в ‹div›, какая функция выполняется, но мне нужно только перезаписать содержимое div в начале функции... Я, наверное, хотел сделать что-то сложное с .when( ), тогда как это действительно легко...   -  person AlexB    schedule 08.10.2013


Ответы (1)


function1 и function2 должны возвращать объекты-обещания, чтобы это работало. Например,

function function1 () {
    return $.ajax({...});
}

теперь вы можете использовать $.when

$.when(function1(),function2()).done(function3);

Редактор:

$.when(function1(),function2()).done(function(){
    function3("test");
});
person Kevin B    schedule 07.10.2013
comment
function3() выполняется, тогда как function1() и function2() не завершены... Для информации, вызов ajax выглядит как $.ajax(...).done(); возврата нет. - person AlexB; 08.10.2013
comment
ОБЯЗАТЕЛЬНО должен быть возврат, иначе не получится. function1 и function2 ДОЛЖНЫ возвращать отложенный или обещанный объект. Если их нет, и вы не можете их изменить, и у них нет обратного вызова, вы ничего не можете сделать. - person Kevin B; 08.10.2013
comment
Итак, я должен вернуть объект promise, но 2 вопроса: где должен быть объявлен Deferred? В качестве глобальной переменной или в функции? И я должен .resolve это ? Я просто пробую оба, но это не работает, я, наверное, что-то забыл... - person AlexB; 08.10.2013
comment
ну, сам $.ajax() уже возвращает объект обещания, поэтому, если вы просто сделаете return $.ajax(.., это сработает. - person Kevin B; 08.10.2013
comment
Я пытался выполнить return $.ajax(), но function3, который отображает что-то на экране, все еще выполняется ДО того, как function1 и 2 завершены. Пожалуйста, посмотрите на мой обновленный вопрос. - person AlexB; 08.10.2013
comment
Мне это кажется правильным... Можете ли вы показать, где вы использовали $.when? - person Kevin B; 08.10.2013
comment
удалите ("test"), если вы хотите передать ему параметр, вам нужно будет использовать там анонимную функцию, которая выполняет function3. - person Kevin B; 08.10.2013
comment
Я только что отследил начало и конец трех функций, и, кажется, все работает, большое спасибо! Что-то отображается раньше, но я думаю, что проблема в другом месте, и я буду выяснять, что именно. Не могли бы вы просто показать мне пример того, что вы называете анонимной функцией, которая выполняет function3 ? - person AlexB; 08.10.2013
comment
Я видел ваше обновление, я попробую это. Спасибо еще раз ! - person AlexB; 08.10.2013