javascript - then - observable jquery
Cadena mĂșltiple "entonces" en jQuery.when (1)
Use una función anónima dentro de .then
y pase los parámetros que desea pasar. Estoy reemplazando a .then
con .done
porque no necesitas .then
en este caso.
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);
});
}
.en realidad, crea un nuevo objeto diferido y lo envía a la cadena. Como no devolvió nada de .then
, el nuevo objeto aplazado no tiene argumentos. Vea este ejemplo:
$.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
});
Si en cambio solo .done
, funcionaría como se esperaba.
$.when($.Deferred().resolve(2), $.Deferred().resolve(4))
.done(function(a,b) {
console.log(a,b);
}).done(function(a,b) {
console.log(a,b);
});
El uso más común para .then
es encadenar solicitudes ajax:
$.ajax({...}).then(function(){
return $.ajax({...});
}).then(function(){
return $.ajax({...});
}).then(function(){
return $.ajax({...});
}).then(function(){
return $.ajax({...});
});
que también se puede hacer fácilmente en un bucle. Cada .then
tendrá acceso a los datos devueltos de la solicitud anterior.
Tengo una función que hace algo como esto:
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 */;
}
Entonces, cuando alguien usa do_something
, también puede encadenar más devoluciones de llamada, como:
do_something().then(function(_foo_2, _bar_2, _baz_2) {
console.log(_foo_2, _bar_2, _baz_2);
});
El problema es que no sé cómo omitir el retorno original de do_something_else
a la función anónima descrita. No quiero recibir una lista, sino argumentos posicionales, así que "cuando foo" inserta algún valor en el _foo de do_something_else y luego el mismo valor va a _foo_2.
¿Cómo puedo hacerlo en JS?