Подтвердить что ты не робот

Цепочка несколько "затем" в jQuery.when

У меня есть функция, которая делает что-то вроде этого:

function do_something() {
    // some code

    return $.when(foo, bar, baz).then(do_something_else);
}

function do_something_else(_foo, _bar, _baz) {
    // do something else

    return /* the original inputs */;
}

Итак, когда кто-то использует do_something, они могут также связывать больше обратных вызовов, например:

do_something().then(function(_foo_2, _bar_2, _baz_2) {
    console.log(_foo_2, _bar_2, _baz_2);
});

Проблема заключается в том, что я не знаю, как обходить исходный возврат из do_something_else в описанную анонимную функцию. Я не хочу получать список, но позиционные аргументы вместо этого, поэтому "когда foo" вставляет какое-то значение в do_something_else _foo, а затем одно и то же значение переходит в _foo_2.

Как я могу сделать это в JS?

4b9b3361

Ответ 1

Используйте анонимную функцию внутри .then и передайте параметры, которые вы хотите передать. Я заменяю .then на .done, потому что в этом случае вам не нужно .then.

function do_something() {
    // some code

    return $.when(foo, bar, baz).done(function(_foo_2, _bar_2, _baz_2){
        do_something_else.apply(this,_foo_2);
    });
}

. then фактически создает новый отложенный объект и отправляет его в цепочку. Поскольку вы ничего не возвращали из .then, новый отложенный объект не имеет аргументов. См. Этот пример:

$.when($.Deferred().resolve(2), $.Deferred().resolve(4))
.then(function(a,b) { 
    console.log(a,b); // 2,4
    return $.Deferred().resolve(a,b,6);
}).then(function(a,b,c) { 
    console.log(a,b,c); // 2,4,6
});

Если вы вместо этого использовали .done, он работал бы так, как ожидалось.

$.when($.Deferred().resolve(2), $.Deferred().resolve(4))
.done(function(a,b) { 
    console.log(a,b);
}).done(function(a,b) { 
    console.log(a,b);
});

Наиболее часто используемым для .then является цепочка ajax-запросов:

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

который также можно легко выполнить в цикле. Каждый .then будет иметь доступ к возвращенным данным из предыдущего запроса.