Perché la promessa di jQuery ha un metodo done(), mentre la promessa di Javascript documentata da Mozilla non ce l'ha? E se voglio avere un done() in JS?
Quali sono le differenze tra le Promesse dei documenti JavaScript di Mozilla (vedi pagina API) e le Promesse di jQuery (vedi pagina API)?
La promessa di Mozilla sembra avere solo 2 metodi: then e catch. La promessa di jQuery sembra avere più metodi, tra cui: then, done e fail. (da qui)
Perché l'API JS su Mozilla non ha done()? E se voglio avere una funzionalità done() in JavaScript? Cosa devo fare?
Risposta n. 1
Le promise di JavaScript di Mozilla si basano sullo standard ES6, mentre le promise di jQuery erano qualcosa creato prima che ES6 fosse rilasciato.
Basandomi sulla mia lettura della documentazione di jQuery, ES6 then è equivalente a jQuery done.
In realtà ci sono un sacco di librerie di promise, ma per me quella di ES6 è la più semplice da capire. Non ti serve più di "then" e "catch" ed è davvero facile concatenarle in una sequenza di operazioni. Aggiungi a questo Promise.all per i task paralleli e il 99% di ciò di cui hai bisogno è coperto.
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;
});
Alcune cose che jQuery supporta e che non sono in ES6 sono una sorta di risoluzione "progress".
Risposta n. 2
L'API deferred di jQuery è gonfiata e precede le librerie di promise. Una volta che si sono resi conto di quanto fossero utili le promise, hanno aggiunto un metodo then (o in precedenza, pipe), tuttavia non sono riusciti a farlo al 100% correttamente.
Com'è che l'API JS su Mozilla non ha
done()?
È completamente inutile. Tutte le implementazioni compatibili con Promises/A+ (che includono ES6) necessitano solo di un singolo metodo: .then(). È completamente universale, puoi fare tutto con esso - è il primitivo delle promise.
Che cosa succede se voglio avere una funzionalità
done()in JavaScript? Cosa devo fare?
Beh, potresti implementarlo tu stesso:
Promise.prototype.done = function(cb) { // or function(...cbs) for (let cb of cbs) …
this.then(cb).then(null, function(err) { /* ignore */ });
return this;
};
Ma come puoi vedere da questo, in realtà non è molto utile. Non fa il chaining e ignora le eccezioni, quindi dovresti semplicemente usare then ovunque.
