qu'advient-il si nous n'avons pas de résoudre ou de rejeter la promesse
J'ai un scénario où je suis de retour d'une promesse.
La promesse fondamentalement donner la réponse d'une requête ajax.
Sur le rejet de la promesse qu'il affiche une boîte de dialogue d'erreur qu'il y a une erreur de serveur.
Ce que je veux faire, c'est quand le code de réponse est 401, je ne veux résoudre les promesses ni de la rejeter(car il montre la boîte de dialogue d'erreur). Je veux simplement rediriger vers la page de connexion.
Mon code ressemble à ceci
function makeRequest(ur,params) {
return new Promise(function(resolve,reject) {
fetch(url,params)
.then((response) => {
let status = response.status;
if (status >= 200 && status < 300) {
response.json().then((data) => {
resolve(data);
})
}
else {
if(status === 401) {
redirectToLoginPage();
}
else {
response.json().then((error) => {
if (!error.message) {
error.message = constants.SERVER_ERROR;
}
reject({status,error});
})
}
}
})
});
}
Comme vous pouvez le voir si le statut est en 401, je suis rediriger vers la page de connexion. La promesse n'est ni résolu ni rejetée.
Est ce code OK?
Ou est-il une meilleure façon de l'accomplir.
Grâce.
OriginalL'auteur Aniket | 2016-04-20
Vous devez vous connecter pour publier un commentaire.
Une promesse est juste un objet avec des propriétés dans le Javascript. Il n'y a pas de magie. Donc, à défaut de le résoudre ou de rejeter une promesse juste ne jamais modifier l'état "en attente", rien d'autre. Cela ne cause aucun problème fondamental en Javascript car une promesse est juste un objet Javascript. La promesse sera toujours obtenir des ordures collectées (même si elles sont encore en attente) si aucun code n'conserve une référence à la promesse.
La conséquence réelle ici est ce que cela signifie pour le consommateur de la promesse si son état n'est jamais changé? Tout
.then()
ou.catch()
auditeurs pour résoudre ou de rejeter les transitions ne sera jamais appelé. La plupart du code qui utilise des promesses attend d'eux pour résoudre ou de refuser à un certain moment dans l'avenir (c'est pourquoi les promesses sont utilisés en premier lieu). S'ils ne le font pas, alors que le code, en général, n'arrive jamais à terminer son travail.Il est possible que vous pourriez avoir d'autres codes qui termine le travail pour cette tâche, et la promesse est juste abandonné sans jamais faire sa chose. Il n'y a pas de problème interne en Javascript si vous le faites de cette façon, mais il n'est pas combien de promesses ont été conçus pour fonctionner et n'est généralement pas comment les consommateurs de promesses s'attendre à travailler.
Dans ce cas particulier, c'est OK et une redirection est un peu spécial et unique cas. Une redirection vers une nouvelle page de votre navigateur va complètement effacer le courant de l'état de la page (y compris tous les Javascript état) de sorte qu'il est parfaitement bien de prendre un raccourci avec la redirection et il suffit de laisser d'autres choses en suspens. Le système sera complètement réinitialiser l'option Javascript de votre état lorsque la nouvelle page se charge alors de toutes les promesses qui étaient encore en suspens sera nettoyé.
Ensuite, c'est une autre affaire qui votre question n'est pas de décrire. Vous devrez assurez-vous que les choses sont nettoyés correctement de sorte que vous n'avez pas de fuites de mémoire. Je n'ai aucune idée si il y aurait un problème avec cela à réagir ou pas. La prochaine fois, merci de mettre ce type d'information dans votre question.
Assurez-vous que vous n'avez pas de références à la
reject
etresolve
fonctions, et pas juste arrêter de référencement de la promesse. Ensuite, le GC doit intervenir. Sinon, si votre code, les références à laresolve
par exemple, alors, la Promesse sera rester dans les parages au cas où votre code jamais les appelsresolve()
. Voici un exemple d'une API Web qui peuvent fuite de Promesses si vous ne faites pas attention: github.com/w3c/webcomponents/issues/674OriginalL'auteur jfriend00
Toujours résoudre ou de rejeter la promesse. Même si vous n'utilisez pas le résultat, en dépit de ce travail, c'est une très mauvaise pratique à obtenir en raison des promesses amour à avaler des erreurs, et le plus complexe de votre code devient, le plus il sera difficile de trouver les quelques endroits où vous n'avez pas explicitement remplir une promesse (de plus, vous ne savez même pas si c'est ça le problème).
OriginalL'auteur kungphu
Je pense que le "ce qui se passe si l'on ne résout pas rejeter" a été répondu fine - c'est votre choix si vous voulez ajouter un
.then
ou un.catch
.Cependant, Est ce code OK? Ou est-il un meilleur moyen d'atteindre ce. Je dirais il y a deux choses:
Vous êtes d'emballage, une Promesse dans
new Promise
quand il n'est pas nécessaire et que lafetch
appel peut échouer, vous devez agir sur de manière à ce que votre méthode d'appel n'a pas s'asseoir et d'attendre pour une Promesse qui ne sera jamais résolu.Voici un exemple (je pense que cela devrait fonctionner pour votre entreprise logique, pas sûr à 100%):
En revanche, l'appel de votre code à l'aide de:
Ne log rien parce que l'appel à
http://example
va échouer, mais lacatch
gestionnaire ne sera jamais exécuter.OriginalL'auteur CodingIntrigue
Il fonctionne et n'est pas vraiment un problème, sauf lorsqu'un appelant de
makeRequest
attend de promesse à remplir. Donc, vous êtes de rompre le contrat.Au lieu de cela, vous pourriez reporter la promesse, ou (dans ce cas) de rejeter avec le code d'état/d'erreur.
OriginalL'auteur nullpotent
Que d'autres ont dit, c'est vrai que c'est pas vraiment un problème si vous n'avez pas de résoudre ou de rejeter une promesse. De toute façon j'permettrait de résoudre votre problème un peu différent:
Cela signifie que je ne le rejette chaque mauvaise réponse de l'état, puis les traiter dans votre
error handler
de votremakeRequest
.OriginalL'auteur Fidel90