Sie sollten nur ein weiteres Versprechen Rückkehr von $q.all
function getNamesById(nameIds) {
var result = [];
nameIds.forEach(function (nameId) {
result.push(account.getNameById(nameId));
});
return $q.all(result);
}
und anschließend Kette dass an anderer Stelle
getNamesById(someNameIds)
.then(...);
Ein klarer Weg, dies zu schreiben, wird mit .map
statt ein Array deklarieren und mit forEach
schieben hinein:
function getNamesById(nameIds) {
return $q.all(nameIds.map(function (nameId) {
return account.getNameById(nameId)
}));
}
Wenn ES6 mit (und Ihre Methode ignoriert definitiv alle, aber das erste Argument) diese weiter vereinfacht werden kann:
let getNamesById = nameIds => Promise.all(nameIds.map(account.getNameById));
So Von Kommentaren vermute ich, dass Sie versuchen, ein assoziatives Array zurück mit als Schlüssel und das Ergebnis des asynchronen Aufrufs als Wert zu erhalten. Es gibt einen weiteren Schritt, den Sie benötigen - Sie müssen Rückkehr ein Wert von Ihrem then
, die Sie später
function getNamesById(nameIds) {
return $q.all(nameIds.map(function (nameId) {
return account.getNameById(nameId)
.then(function(name){
return {id:nameId, name:name};
})
}));
}
verbrauchen Wenn Sie diese Methode verbrauchen, können Sie einfach reduce
das Ergebnis auf Ihre assoziatives Array
getNamesById(["a","b","c"])
.then(function(results){
var values = results.reduce(function(p,n){
p[n.id] = n.name;
return p;
},{});
// values is your associative array with keys a,b & c
});
in ES6 Schrieben macht dies viel weniger ausführlich - der Vollständigkeit halber:
function getNamesById(nameIds) {
return $q.all(nameIds.map(
nameId => account.getNameById(nameId)
.then(name => ({id:nameId, name:name}))
);
}
und
getNamesById(["a","b","c"])
.then(results => {
var values = results.reduce((p,n) => {
p[n.id] = n.name;
return p;
},{});
// values is your associative array with keys a,b & c
});
Sie [kann 'forEach' mit Versprechen nicht verwenden (https://stackoverflow.com/q/37576685/1048572). Vermeiden Sie auch die [latent antipattern] (http://stackoverflow.com/q/23803743/1048572?Was-ist-die-Promose-Construction-antipattern-and-how-zum- Vermeiden-)! – Bergi
Danke Jamiec und @Bergi – uromay
@JaromandaX 'forEach' +' push' ist so hässlich, dass ich es nicht berücksichtigen möchte :-) – Bergi