AngularJS - échec resilence sur q$.tous les()
Je vais essayer de combler certaines des données locales de la résolution d'une série d'appels à distance.
Lors de chaque promesse est résolu, je charge les données et de procéder.
La méthode $q.all( [] )
fait exactement ceci:
$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)
})
Le problème est que ce code n'est pas résilient.
Si l'un de ces échec de l'appel, personne ne peut le poisson!
Envelopper les appels dans une instruction try/catch, il suffit de causes $q.all()
d'ignorer totalement l'entrée, même lorsqu'il n'est pas à l'échec (note de la console.journal de la touche 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)
})
De sortie:
[Objet]
Aucune indication sur la façon dont je pourrais conclure à être résilient?
Grâce à @dtabuenc, j'ai franchi une étape supplémentaire.
La mise en œuvre de l'erreur de rappel, je ne peux éviter la rupture de la chaîne, puis appuyez sur les valeurs de l'résolu promesses.
Cependant, un méchant Exception est toujours affiché sur la console...
Comment puis-je me débarrasser de cela, si je ne peux pas try/catch sur demandes asynchrones?
Appelant 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)
})
Appelé code (injecter avec une exception)
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
}
})
},
Vous devez vous connecter pour publier un commentaire.
Ce sera travaux, mais aussi de pousser les erreurs dans le tableau.
Vous devriez également d'améliorer votre compréhension de promesses, vous jamais doit utiliser
try-catch
avec des promesses - lors de l'utilisation de promesses, vous utilisez le.catch()
méthode (avec tout le reste étant implicitement untry
). Cela fonctionne pour la normale des erreurs ainsi que des erreurs asynchrones.Si vous souhaitez ignorer totalement les erreurs:
Je pense que c'est plus facile à faire :
Je ne suis pas sûr de ce que tu veux dire par la résistance. Que voulez-vous arriver si l'une des promesses de panne?
Votre try-catch ne fonctionnera pas parce que la promesse échoue de manière asynchrone.
Cependant, vous pouvez transmettre à un gestionnaire d'erreur, que le second paramètre de la
then()
appel et faire ce que vous souhaitez il.Même problème ici. Pour ceux d'entre vous avec des boucles for: à l'intérieur d'un puis de réponse:
@Esailija la réponse semble être une solution à un problème.
Vous ne pouvez pas résoudre le problème à l'extérieur le principal contributeur au problème:
$q
.Il semble un peu plus sage d'avoir rejeter des rappels pour chaque
then
(2e argument) et y insérer$q.reject(...)
.Exemple:
Cela est particulièrement indiqué lorsque l'INTERFACE utilisateur du modèle dépend de l'ensemble des appels ajax.
Personnellement, je pense que c'est la manière la plus sûre de procéder de toute façon, car la plupart du temps vous ne voulez pousser certains messages du serveur de toasts composant sur le rejeter rappels, ou avertir l'utilisateur d'une certaine façon (queuing 7 appels ajax ne signifie pas que vous ne pouvez pas montrer quoi que ce soit parce que 1 a échoué - cela signifie que vous ne serez pas en mesure de montrer une certaine région de l'écran - qui a besoin d'une institution spécialisée de la rétroaction à l'utilisateur).