Unter der Annahme, dass "ein Promise.all cancel()" bedeutet "sicherzustellen, dass die von einem Promise.all zurück Versprechen() nicht seinem Erfolg Pfad folgen" ....
Versprechen sind nicht stornierbar, aber Muster-basierte Lösung (en) sind verfügbar.
Das Konzept hier ist relativ einfach. Im Wesentlichen sind Sie können in jeder Charge von Versprechen ein Versprechen, dass:
- gelöst werden, wenn die Rohmasse erfolgreich
- wird bei der Erstellung der nächsten Charge zurückgewiesen werden.
Es ist eine Art Rasse des Guten gegen das Böse.
Der schwierige Teil macht die "Super-Aggregation" transparent für die Ergebnisse.
Hier ist eine Möglichkeit, es zu schreiben - vielleicht nicht die prägnanteste - jemand kann einen besseren Weg finden.
function BatchCanceller() {
// Return a function, which accepts an array of promises and returns an aggregated promise.
// Use the returned function like $q.all().
var dfrd;
return function(promises) {
if(dfrd) {
dfrd.reject(new Error('cancelled')); // reject previous batch
}
dfrd = $q.defer();
// Preparation; ensure that `promises`, if all are successful, resolve `dfrd`.
$q.all(promises).then(dfrd.resolve);
// Now include `dfrd` in a super-aggregation of `promises`
return $q.all(promises.concat(dfrd.promise)) // Will the aggregated `promises` resolve before another batch causes `dfrd.reject()`?
.then(function(results) {
// Yay! the aggregated `promises` won out.
return results.splice(0, results.length-1); // remove the unwanted extra result.
}); // no need to handle error here
};
}
var batchCanceller = new BatchCanceller();
var promises = [/* whatever */];
batchCanceller(promises).then(function(results) {
console.log(results);
}).catch(function(error) {
console.log(error); // message is "cancelled" if another `batchCanceller(promises)` is executed before the previous one resolves.
});
In der Praxis würden Sie wahrscheinlich wählen BatchCanceller()
als Angular Werk zum Ausdruck bringen.
Versprechen sind nicht stornierbar. Es gab eine Spezifikation in der Arbeit, um sie so zu machen, aber die Arbeit daran wurde gestoppt. – toskv
@toskv Also, Versprechen sind nicht kündbar, aber die Spezifikation, um kündbare Versprechen zu machen, war selbst offensichtlich kündbar. –
@ JeffBowman leider war es sehr stornierbar. :( – toskv