AngularJS - fail resilence auf $q.alle()
Ich versuche zu füllen, einige lokale Daten die Lösung einer Reihe von remote-Aufrufe.
Wenn jede Verheißung ist gelöst, ich habe die Daten laden und fahren.
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, dieser code ist nicht belastbar.
Wenn einer dieser Aufruf fehlschlägt, bekommt niemand die Fische!
Verpackung die Aufrufe in einen try/catch-Anweisung, die einfach bewirkt, dass $q.all()
völlig ignoriert, der Eintrag, auch wenn er nicht ausfällt (Anmerkung der Konsole.log dich in der func)...
$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)
})
Ausgabe:
[Objekt]
Jeder Hinweis darauf, wie ich mich wickeln konnte diese ausdauernd zu sein?
Dank @dtabuenc, ich habe einen Schritt weiter gegangen.
Die Implementierung der Fehler-callback kann ich vermeiden, das brechen der Kette, und push die Werte, die gelöst verspricht.
Jedoch eine böse Ausnahme ist immer noch auf der Konsole angezeigt...
Wie kann ich loswerden, dass wenn ich nicht try/catch-auf asynchrone Anfragen?
Anrufer-code
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)
})
Aufgerufenen code (Spritzen 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
}
})
},
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird diese Arbeit, sondern auch schieben Sie den Fehler auf das array.
Sollten Sie auch besser zu verstehen, verspricht Sie nie verwenden sollten
try-catch
mit verspricht - wenn Sie mit Versprechungen, die Sie verwenden, die.catch()
Methode (alles andere wird implizit einetry
). Dies funktioniert für die normalen Fehler asynchrone Fehler.Wenn Sie wollen, völlig ignorieren der Fehler:
Ich glaube, es ist einfacher zu tun :
Ich bin mir nicht sicher, was du damit meinst belastbar. Was wollen Sie passieren, wenn man sich von den Versprechungen nicht?
Try-catch funktioniert nicht, weil das Versprechen fehl, asynchron.
Können Sie jedoch passieren einem Fehler-handler, die als zweiter parameter an die
then()
nennen und tun, was Sie wollen dort.Gleiche Problem hier. Für diejenigen von Euch, die mit for-Schleifen: innerhalb eines response:
@Esailija die Antwort scheint wie eine Lösung für ein problem.
Das Sie nicht lösen können das problem außerhalb der Hauptverursacher des Problems:
$q
.Es scheint ein bisschen klüger zu haben, ablehnen Rückrufe für jeden
then
(2. argument) und in es einfügen$q.reject(...)
.Beispiel:
Dies ist besonders dann angezeigt, wenn das UI-Modell richtet sich an alle ajax-Aufrufe.
Ich persönlich denke, das ist der sichere Weg zu gehen sowieso, weil die meisten Zeiten, die Sie tun möchten, schieben einige server Nachrichten an einige toast-Komponente auf die lehnen Rückrufe, oder warnen den Benutzer in irgendeiner Weise (queuing-7 ajax-Aufrufe bedeutet nicht, Sie können nicht alles zeigen, weil 1 ist fehlgeschlagen - es bedeutet, dass Sie nicht in der Lage sein zu zeigen, einige Regionen des Bildschirm -, muss eine spezielle Rückmeldung an den Benutzer).