Búsqueda de sitios web

¿Por qué la promesa de jQuery tiene un done(), pero la promesa de Javascript documentada por Mozilla no lo tiene? ¿Qué pasa si quiero tener un done() en JS?


¿Cuáles son las diferencias entre las Promesas de la documentación de JavaScript de Mozilla (ver página de API) y las Promesas de jQuery (ver página de API)?

La promesa de Mozilla parece tener solo 2 métodos: then y catch. La promesa de jQuery parece tener más métodos, incluyendo: then, done y fail. (de aquí)

¿Por qué la API de JS en Mozilla no tiene done()? ¿Qué pasa si quiero tener una funcionalidad done() en JavaScript? ¿Qué debo hacer?

Respuesta #1

Las promesas de JavaScript de Mozilla se basan en el estándar ES6, mientras que las promesas de jQuery eran algo creado antes de que se lanzara ES6.

Según mi lectura de la documentación de jQuery, ES6 then es equivalente a jQuery done.

En realidad, hay una gran cantidad de bibliotecas de promesas, pero para mí la de ES6 es la más sencilla de entender. No necesitas más que "then" y "catch" y es realmente fácil encadenarlas en una secuencia de operaciones. Añade a eso Promise.all para tareas en paralelo y el 99% de lo que necesitas está cubierto.

return doSomething().then(function(result) {
  return doSomethingElse(result);
}).then(function(secondResult) {
  return doThirdSomething(secondResult);
}).catch(function(err) {
  console.log(err);
}).then(function(finalResult) {
  // a then after a catch is like a "finally" or "always"
  return finalResult;
}); 

Algunas cosas que jQuery sí soporta y que no están en ES6 son algún tipo de resolución de "progreso".

Respuesta #2

La API diferida de jQuery está inflada y es anterior a las bibliotecas de promesas. Una vez que se dieron cuenta de lo útiles que eran las promesas, añadieron un método then (o anteriormente, pipe), sin embargo, no lograron hacerlo al 100% correctamente.

¿Por qué la API de JS en Mozilla no tiene done()?

Es completamente innecesario. Todas las implementaciones compatibles con Promises/A+ (lo que incluye ES6) solo necesitan un único método: .then(). Es completamente universal, puedes hacer todo con él: es el primitivo de las promesas.

¿Qué pasa si quiero tener una funcionalidad done() en JavaScript? ¿Qué hago?

Bueno, podrías implementarlo tú mismo:

Promise.prototype.done = function(cb) { // or function(...cbs) for (let cb of cbs) …
    this.then(cb).then(null, function(err) { /* ignore */ });
    return this;
};

Pero como puedes ver a partir de eso, en realidad no es muy útil. No se encadena y ignora las excepciones, así que deberías usar then en todas partes.