Quelle est la meilleure façon d'envelopper synchrone fonctions dans une promesse
Disons que j'ai une fonction Synchrone comme path.join()
. Je veux enrouler sur un Promise
parce que je veux excetions être traitées dans catch()
bloc.
Si j'envelopper comme ci-dessous, je ne peux pas une exception dans Promise
's .catch()
bloc. J'ai donc utiliser if
pour vérifier la valeur de retour, si c'est une erreur ou pas, et ensuite appeler résoudre, de rejeter les fonctions. Existe-il d'autres solutions?
var joinPaths = function(path1,path2) {
return new promise(function (resolve, reject) {
resolve(path.join(path1, path2));
});
};
Pourquoi voulez-vous envelopper d'une fonction synchrone dans une promesse?
Le test unitaire est un cas commun, quand on a besoin de remplacer certains appel asynchrone avec la valeur codée en dur
La meilleure façon d'enrouler une fonction synchrone dans une promesse de ne pas le faire.
Ensuite, utilisez
si im en utilisant
Le test unitaire est un cas commun, quand on a besoin de remplacer certains appel asynchrone avec la valeur codée en dur
La meilleure façon d'enrouler une fonction synchrone dans une promesse de ne pas le faire.
Ensuite, utilisez
Promise.resolve().then(()=> path.join(path1, path2)).…
si im en utilisant
path.join
à l'intérieur d'un then()
, donc je peux gérer toutes les exceptions dans un bloc catchOriginalL'auteur CoderS | 2016-04-24
Vous devez vous connecter pour publier un commentaire.
Il est difficile de savoir pourquoi vous envelopper d'une opération synchrone dans une promesse que cela rend simplement plus difficiles à utiliser et opérations synchrones peuvent déjà être utilisés à l'intérieur de la promesse des chaînes de l'amende juste.
Les deux seuls endroits que j'ai vu, il est utile de faire une promesse de quelque chose synchrone de la création d'une promesse de la chaîne où les opérations suivantes seront async ou lorsque vous êtes à la ramification et l'un des résultats de la branche est asynchrone promesse et l'autre est synchrone. Alors, dans ce cas, vous voulez juste de retour d'une promesse dans les deux cas, donc, l'appelant dispose d'un async interface de n'importe quelle branche est prise.
Autre que cela, vous devriez généralement pas synchrone choses asynchrone car elle complique inutilement les utiliser.
La façon la plus simple que je connaisse pour faire une promesse serait celui-ci:
Par vos commentaires, à l'intérieur d'un
.then()
gestionnaire d'exceptions sont déjà conquis par la promesse de l'infrastructure et de les transformer en refus de la promesse. Donc, si vous avez eu ce:Alors, que l'exception est déjà mappé dans une promesse de rejet pour vous. Bien sûr, si vous voulez gérer l'exception à l'intérieur de la
.then()
gestionnaire (ne pas tourner à la promesse dans un rejet), vous pouvez simplement utiliser un traditionnel try/catch autour de votre opération synchrone pour attraper un local exception (pas différent de tout autre code synchrone). Mais, si vous voulez la promesse de le rejeter si il y a une exception à l'intérieur de la.then()
gestionnaire, alors que tout est fait pour vous automatiquement (une caractéristique très intéressante de promesses).path.join
dans la promesse de la chaîne et je veux gérer les exceptions danspromise
's.catch()
bloc, comment puis-je le faire avec l'enveloppant dans une promesse?Comme toujours, si vous mettez votre code actuel et réel problème dans votre question, nous pouvons vous aider à beaucoup mieux. Je n'ai pas suivi exactement ce que vous essayez de faire. Un
.then()
gestionnaire dans une promesse de la chaîne est déjà enveloppé dans un try/catch et toute exception est levée dans une.then()
gestionnaire de rejeter la promesse de la chaîne automatiquement. Vous n'avez pas à tout faire pour obtenir cette fonctionnalité à l'intérieur d'un.then()
gestionnaire. Vous pouvez également utiliser try/catch-vous d'attraper un synchrones exception et de les traiter localement.L'une des raisons pour lesquelles vous pourriez vouloir envelopper d'une fonction synchrone dans une promesse est si vous essayez de coller à un contrat, c'est à dire
if (needsUpdating) { return object.asyncUpdate(); } else { return object };
Si un chemin d'accès renvoie une Promesse, alors il devrait le chemin d'autres, même si ce n'est pas exécuter n'importe quel code asynchrone.OriginalL'auteur jfriend00