Ответ 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
будет иметь доступ к возвращенным данным из предыдущего запроса.