Ce qui se passe avec q$.tous les() lors de certains appels de travail et d'autres échouent?
Ce qui se passe avec q$.tous les() lors de certains appels de travail et d'autres échouent?
J'ai le code suivant:
var entityIdColumn = $scope.entityType.toLowerCase() + 'Id';
var requests = $scope.grid.data
.filter(function (rowData, i) {
return !angular.equals(rowData, $scope.grid.backup[i]);
})
.map(function (rowData, i) {
var entityId = rowData[entityIdColumn];
return $http.put('/api/' + $scope.entityType + '/' + entityId, rowData);
});
$q.all(requests).then(function (allResponses) {
//if all the requests succeeded, this will be called, and $q.all will get an
//array of all their responses.
console.log(allResponses[0].data);
}, function (error) {
//This will be called if $q.all finds any of the requests erroring.
var abc = error;
var def = 99;
});
Lorsque la totalité de la somme http appelle travail puis la allResponses tableau est rempli avec des données.
Quand on échoue à la c'est ma compréhension que la deuxième fonction sera appelée, et la variable d'erreur donné plus de détails.
Toutefois quelqu'un peut-il aider à m'expliquer ce qui se passe si certaines des réponses de travail et d'autres échouent?
- L'objectif de
$q.all
est d'effectuer des appels en parallèle, mais de gérer tous les résultats simultanément, de sorte que si l'un manque, il abandonne immédiatement. Pensez à cela comme une sorte de booléens ET, si l'une est fausse, le résultat sera faux. - Similaire: stackoverflow.com/questions/21626251/...
Vous devez vous connecter pour publier un commentaire.
Je crois que depuis que la promesse de la bibliothèque est basée sur
Q
mise en œuvre, dès que la première promesse est rejetée, le rejet de rappel est appelée avec l'erreur. Il n'attend pas d'autres promesses d'résolu. Voir la documentation deQ
https://github.com/kriskowal/q. Pour Q. tout cela est ce qui est mentionnéfinally
peut vous aider. Peut-être que vous avez besoin pour briser les promesses de bas en groupes.Il a été un moment depuis que cette question a été posté, mais peut-être que ma réponse pourrait encore aider quelqu'un. J'ai résolu un problème similaire sur ma fin, par simple résolution, toutes les promesses, mais avec un retour j'ai pu traiter plus tard et de voir s'il y avait des erreurs. Voici mon exemple utilisé pour précharger des actifs d'image:
Plus tard, je peux voir ceux qui sont errorious:
Edit: pris en charge Uniquement dans Kris Kowal Q - mais encore utile friandise
Si vous voulez traiter de tous, sans rejeter tout de suite à l'échec d'utiliser
allSettled
Voici ce que les docs disent:
allSettled
fait partie de la kriskowal Q mais ne faisant pas partie de l'écart Angulaire q $de mise en œuvre.Voici une petite réponse.
Dans ce violon vous pouvez voir comment cela fonctionne, si une erreur se produit dans une certaine promesse.
http://jsfiddle.net/wd9w0ja4/
J'ai trouvé une nouvelle angulaire paquet ajouter le allSettled de la fonctionnalité $q angulaire:
https://github.com/ohjames/angular-promise-extras
Pourriez-vous pas simplement gérer la condition d'erreur sur votre $http promesses avant de les transmettre à $q? Les promesses sont enchaînés, donc cela devrait fonctionner:
Évidemment, vous pourriez changer la noop dans toute transformation que vous voulez, mais cela empêche le rejet qui empêche
$q.all
de défaut.Dans mon cas, j'ai besoin de savoir, lors de la dernière promesse a été décidé de ne importe en cas de succès ou d'échec. q$.tous n'était pas une option parce que si l'un tombe en panne, il descend immédiatement. J'avais besoin de cela pour s'assurer de l'utilisateur sera redirigé n'importe quoi, mais seulement si toutes les données sont traitées (ou pas), de sorte qu'ils peuvent être chargés sur la page suivante. Je me suis donc retrouvé avec ce:
Je sais que c'est assez boiteux façon de le faire mais il a travaillé pour moi.