Sto cercando di riempire alcuni dati locali risolvendo una serie di chiamate remote.
Quando ogni promessa viene risolta, carico i dati e procedo.
Procedimento $q.all([])
fa esattamente questo:
$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)
})
problema è, questo codice non è resiliente.
Se una di queste chiamate fallisce, nessuno prende il pesce!
avvolgendo le chiamate in un try/catch, semplicemente provoca $q.all()
di ignorare del tutto la voce, anche quando non mancando (notare il console.log nel 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)
})
uscita:
[oggetto]
Qualche suggerimento su come potrei avvolgere questo per essere resiliente?
Grazie a @dtabuenc, ho fatto un ulteriore passo avanti. Implementando la richiamata di errore, posso evitare la rottura della catena e spingere i valori delle promesse risolte.
Tuttavia, una cattiva eccezione viene ancora visualizzata sulla console ... Come posso sbarazzarmene se non riesco a provare/catturare richieste asincrone?
codice chiamante
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)
})
codice Callee (iniettare con un'eccezione)
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
}
})
},
In realtà, sono ancora un principiante su Angular, promesse e persino JS, e sono più che felice di imparare cose nuove ogni giorno! Il metodo .catch() ancora non "blocca" l'eccezione che ho generato nel mio ultimo esempio, ma penso che sia il più vicino possibile al mio risultato ideale. Grazie! – domokun
@domokun promesse angolari riportano erroneamente anche eccezioni rilevate, violando lo spirito di Promises/A + se non violando le specifiche – Esailija
Buono a sapersi ... Immagino ... Thx again! – domokun