Angenommen, newsService.getNews()
gibt eine Zusage zurück, die in einen zufälligen Nachrichteneintrag aufgelöst werden sollte, der von einem Dienst zurückgegeben wird, während translateService.translate()
ein Versprechen zurückgibt, das zur Übersetzung der Text wurde übergeben.Warten Sie, bis alle verschachtelten Versprechen abgeschlossen sind, aber immer noch auf jede einzelne Lösung reagieren
var newsPromises = [];
var translatePromises = [];
for (var i = 0; i < 5; i++) {
var p1 = this.newsService.getNews();
newsPromises.push(p1);
p1.then(function (data) {
var p2 = this.translateService.translate(data);
translatePromises.push(p2);
p2.then(function (translatedData) {
addNews(`${data} (${translatedData})`);
}, function (fail) {
console.log(fail.message);
});
}, function (fail) {
console.log(fail.message);
});
}
jetzt die Seite zeigt zunächst eine Lade Spinner, die Ich mag würde die Versprechungen verstecken, wenn alle (einschließlich der verschachtelten Übersetzung Versprechen) abgeschlossen haben (erfolgreich oder nicht):
Promise.all(newsPromises)
.then(function (results) {
Promise.all(translatePromises).then(function (results) {
removeLoading();
},
function (err) {
removeLoading();
}
);
}, function (err) {
Promise.all(translatePromises).then(function (results) {
removeLoading();
},
function (err) {
removeLoading();
}
);
});
Dieser Code ein) funktioniert nicht so, wie es sollte, da der Ladespinner einige Male verschwindet, bevor die Versprechen gelöst werden, und b) schrecklich komplex ist.
Wie wird das richtig gemacht? (Mit Vanille JS/ES6)