Hvorfor har jQuery's promise en done(), men Javascript's promise dokumenteret af Mozilla har ikke? Hvad hvis jeg vil have en done() i JS?
Hvad er forskellene mellem Mozillas JavaScript-dokumenters Promises (se API-side) og jQuerys Promises (se API-side)?
Mozillas løfte synes kun at have 2 metoder: then og catch. jQuerys løfte synes at have flere metoder, inklusiv: then, done og fail. (fra her)
Hvordan kan det være, at JS API'en på Mozilla ikke har done()? Hvad hvis jeg vil have en done()-funktionalitet i JavaScript? Hvad gør jeg?
Svar #1
Mozillas JavaScript-løfter er baseret på ES6-standarden, mens jQuery-løfter var noget, der blev skabt, før ES6 blev udgivet.
Baseret på min læsning af jQuery-dokumentationen, er ES6 then det samme som jQuery done.
Der er faktisk en masse promise-biblioteker, men for mig er ES6-versionen den letteste at forstå. Du behøver ikke mere end "then" og "catch", og det er virkelig nemt at kæde sammen til en sekvens af operationer. Tilføj derudover Promise.all for parallelle opgaver, og 99 % af det, du har brug for, er dækket.
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;
});
Nogle ting, som jQuery understøtter, som ikke findes i ES6, er en form for "progress" resolve.
Svar #2
jQuery's deferred API er oppustet og går forud for promise-biblioteker. Da de indså, hvor nyttige promises var, tilføjede de en then (eller tidligere, pipe) metode, men de lykkedes ikke med at få det 100% korrekt.
Hvordan kan det være, at JS API'en på Mozilla ikke har
done()?
Det er helt unødvendigt. Alle Promises/A+ kompatible implementeringer (som inkluderer ES6) har kun brug for én metode: .then(). Det er fuldstændig universelt, du kan gøre alt med det - det er primitive for promises.
Hvad hvis jeg vil have en
done()-funktionalitet i JavaScript? Hvad gør jeg?
Nå, du kunne implementere det selv:
Promise.prototype.done = function(cb) { // or function(...cbs) for (let cb of cbs) …
this.then(cb).then(null, function(err) { /* ignore */ });
return this;
};
Men som du kan se af det, er det faktisk ikke særlig nyttigt. Det kæder ikke, og det ignorerer undtagelser, så du bør bare bruge then overalt.
