Pregunta jQuery.Deferred (). Entonces, cómo resolver con múltiples parámetros


Entonces, mi API espera que cuando se resuelva un aplazamiento en particular, obtenga 2 params.

fn().done(function(arg1, arg2) {
  console.log(arg1, arg2);
}).fail(function(err) {
  console.error(err);
});

Ahora relacionado con el fn función anterior, primero debe esperar a que otra persona diferida regrese antes de resolverla.

function other() {
  // stubbed out to always resolve
  return $.Deferred().resolve().promise();
}

function fn() {
  return other().then(function() {
    return [1, 2];
  });
}

Pero esto no está funcionando, porque arg1 vendrá como [1, 2] y arg2 estarán undefined. No puedo entender cómo devolver algo de Deferred.then() Primer argumento de la función de filtro de éxito para que el flujo diferido resultante se resuelva con múltiples argumentos.

Por supuesto que puedo hacer esto:

function fn() {
  var done = $.Deferred();
  other().done(function(){
    done.resolve(1, 2);
  }).fail(function(){
    done.reject.apply(done, arguments);
  });
  return done.promise();
}

Pero eso no es tan elegante como usar .then() y ahora tengo que preocuparme por la API de caso de falla negativa cada vez, aunque sé que estoy simplemente canalizando el estado rechazado.

Y sí, también podría cambiar fn() Api para resolver con una matriz, pero realmente espero que haya una solución elegante para esto.


12
2017-07-11 18:08


origen


Respuestas:


Tendrás que invocar resolve() o reject() para pasar múltiples argumentos

.then() no incluye ningún mecanismo para "extensión"una colección devuelta. Solo mantendrá intacta la colección como primer argumento.

Pero, interactuará con un Deferred o promete que ha sido devuelto Desde el párrafo que comienza con "A partir de jQuery 1.8":

Estas funciones de filtro pueden devolver un nuevo valor que se transferirá a las devoluciones de llamada .done () o .fail () de la promesa, o pueden devolver otro objeto observable (Deferred, Promise, etc.) que pasará su estado y valores resueltos / rechazados a los callbacks de la promesa.

Entonces, podrías usar tu ejemplo de other() como base para fn() para mantenerlo bastante breve con otro Deferred():

function fn() {
    return other().then(function () {
        return $.Deferred().resolve(1, 2).promise();
    });
}

fn().then(function (a, b) {
    console.log(arguments.length, a, b); // 2 1 2
});

http://jsfiddle.net/cqac2/


15
2017-07-11 18:26