Ich versuche, einige lokale Daten zu füllen, die eine Reihe von Remoteaufrufen lösen.
Wenn jedes Versprechen gelöst ist, lade ich die Daten und fahre fort.
Die Methode $q.all([])
tut genau dies:
$q.all([
this.getUserInfo(11)
.then(function (r) {
results.push(r)
}),
this.getUserConns()
.then(function (r) {
results.push(r)
}),
this.getUserCtxs()
.then(function (r) {
results.push(r)
})
])
.then(function() {
console.log(results)
})
Problem ist, ist dieser Code nicht elastisch.
Wenn einer dieser Anrufe fehlschlägt, bekommt niemand den Fisch!
Umwickeln die Anrufe in einer try/catch-Anweisung verursacht einfach $q.all()
zu ganz den Eintrag zu ignorieren, auch wenn sie nicht (man beachte die console.log in der func) versagt ...
$q.all([
this.getUserInfo2(11)
.then(function (r) {
results.push(r)
}),
function() {
try {
this.getUserGroups()
.then(function (r) {
console.log(r)
results.push(r)
})
}
catch (err) {
console.log(err)
}
},
])
.then(function() {
console.log(results)
})
Ausgang:
[Objekt]
Irgendein Hinweis darauf, wie ich dies umwickeln könnte, um belastbar zu sein?
Dank @dtabuenc bin ich noch einen Schritt weiter gegangen. Durch die Implementierung des Fehlerrückrufs kann ich das Brechen der Kette vermeiden und die Werte der aufgelösten Versprechen verschieben.
Allerdings wird immer noch eine unangenehme Ausnahme auf der Konsole angezeigt ... Wie kann ich das loswerden, wenn ich Async-Anfragen nicht versuchen/fangen kann?
Anrufercode
return $q.all([
this.getUserInfo(user_id)
.then(function (r) {
results['personal_details'] = r
}),
this.getUserConns()
.then(
function (r) {
results['connections'] = r
},
function(err) {
console.log(err)
})
])
.then(function() {
return (results)
})
Callee Code (injizieren mit einer Ausnahme)
getUserConns: function() {
return __doCall(ws.getUserConnections, {})
.then(function(r) {
// very generic exception injected
throw new Error
if (r && r.data['return_code'] === 0) {
return r.data['entries']
}
else {
console.log('unable to retrieve the activity - err: '+r.data['return_code'])
return null
}
})
},
Eigentlich bin ich noch ein Newbie auf Angular, verspricht und sogar JS, und ich bin mehr als glücklich, jeden Tag neue Dinge zu lernen! Die .catch() -Methode "blockiert" die Ausnahme nicht, die ich bei meinem letzten Beispiel spawne, aber ich denke, es ist am nächsten zu meinem idealen Ergebnis. Danke! – domokun
@ Domokun Winkel verspricht fälschlicherweise berichten sogar gefangen Ausnahmen, verletzen den Geist der Versprechen/A + wenn nicht gegen die Spezifikation – Esailija
Gut zu wissen ... Ich denke ... Thx wieder! – domokun