Promesse.résoudre vs nouvelle Promesse(résoudre)
Je suis en utilisant bluebird et je vois deux façons de résoudre synchrone fonctions dans une Promesse, mais je ne comprends pas les différences entre les deux façons. Il ressemble à la stacktrace est un peu différent, de sorte qu'ils ne sont pas seulement un alias
, droit?
Alors, quelle est la manière préférée?
Façon Un
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
B
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
Promise.resolve
est juste un peu de sucre.- Réponse courte - pas de diff dans l'utilisation. Juste un peu de sucre.
- Qu'est-ce que le "sucre" ?
- Sucre syntaxique est la syntaxe conçu pour rendre les choses plus faciles à lire ou à exprimer. voir: wikipédia.
Vous devez vous connecter pour publier un commentaire.
Contraire à la fois des réponses dans les commentaires - il y a une différence.
Tout
est essentiellement la même que
il y a une subtilité.
Promesse de retour des fonctions qui doivent généralement avoir la garantie qu'ils ne devraient pas jeter de façon synchrone, car ils pourraient jeter de manière asynchrone. Afin d'éviter des résultats inattendus et des conditions de course - les lancers sont généralement convertis en retour des rejets.
Avec cela à l'esprit lors de la spécification a été créé à la promesse du constructeur est de jeter un coffre-fort.
Que si
someObject
estundefined
?Bluebird a vu cela, et Petka ajouté
Promise.method
pour répondre à cette question de sorte que vous pouvez continuer d'utiliser les valeurs de retour. Donc la bonne et de la manière la plus facile d'écrire dans cet Bluebird est en fait ni - c'est:Promesse.méthode de convertir les jette à la rejette et retourne à l'décide pour vous. Il est le plus jeter de façon sécuritaire de le faire et il l'assimile
then
ables à travers les valeurs de retour de sorte qu'il faudrait travailler, même sisomeObject
est en fait une promesse à elle-même.En général,
Promise.resolve
est utilisé pour le moulage d'objets et étrangers promesses (thenables) de promesses. C'est son cas d'utilisation.Promise.resolve()
est un anti-modèle?Promise.resolve()
créer une nouvelle instance dePromise
de la même façon que l'utilisation denew
? Si non,return Promise.resolve(yourCode)
serait plus rapide et éviter synchrone lancers.Promise.coroutine
qui est encore plus utile.Il y a une autre différence non mentionnés ci-dessus par les réponses ou commentaires:
Si
someObject
est en attente d'unPromise
,new Promise(resolve)
serait un coût supplémentaire tique.Comparer deux extrait de code suivant:
JS:
JS:
Le deuxième extrait de l'imprimez 'tique 3' d'abord. Pourquoi?
Si la valeur est une promesse,
Promise.resolve(value)
aurait valeur de retour exactement.Promise.resolve(value) === value
serait vrai. voir MDNMais
new Promise(resolve => resolve(value))
serait de retour une nouvelle promesse qui a bloqué pour suivre lesvalue
promesse. Il a besoin d'un tick supplémentaire pour faire de la "condamnation'.La
tick 1
.then
appel exécuter en premier.Références: