J'utilise bluebird et je vois deux façons de résoudre les fonctions synchrones dans une promesse, mais je n'obtiens pas les différences entre les deux. Il semble que le stacktrace soit un peu différent, donc ils ne sont pas seulement un alias
, non?
Alors, quelle est la méthode préférée?
Voie A
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
Voie B
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
Promise.resolve
est juste du sucre.Réponses:
Contrairement aux deux réponses dans les commentaires - il y a une différence.
Tandis que
est fondamentalement le même que
il y a une subtilité.
Les fonctions de retour de promesse devraient généralement avoir la garantie de ne pas être lancées de manière synchrone car elles pourraient être lancées de manière asynchrone. Afin d'éviter des résultats inattendus et des conditions de course, les lancers sont généralement convertis en rejets retournés.
Dans cet esprit, lorsque la spécification a été créée, le constructeur de promesse est sécurisé.
Et si
someObject
c'estundefined
?Bluebird l'a vu et Petka a ajouté
Promise.method
pour résoudre ce problème afin que vous puissiez continuer à utiliser les valeurs de retour. Donc, la façon correcte et la plus simple d'écrire ceci dans Bluebird n'est en fait ni l'un ni l'autre - c'est:Promise.method convertira les lancers en rejets et les retours en résolutions pour vous. C'est le moyen le plus sûr de le faire et il assimile les
then
capacités via des valeurs de retour afin que cela fonctionne même s'ilsomeObject
s'agit en fait d'une promesse elle-même.En général, il
Promise.resolve
est utilisé pour transformer des objets et des promesses étrangères (alorsables) en promesses. C'est son cas d'utilisation.la source
Promise.resolve()
est un anti-pattern?Promise.resolve()
créer une nouvelle instance dePromise
de la même manière que l'utilisationnew
? Sinon,return Promise.resolve(yourCode)
serait plus rapide et éviterait les lancers synchrones.Promise.coroutine
ce qui est encore plus utile.Il y a une autre différence non mentionnée par les réponses ou les commentaires ci-dessus:
Si
someObject
est aPromise
,new Promise(resolve)
cela coûterait deux ticks supplémentaires.Comparez deux extraits de code suivants:
Le deuxième extrait de code afficherait d'abord «tick 3». Pourquoi?
Si la valeur est une promesse,
Promise.resolve(value)
renvoie la valeur exactement.Promise.resolve(value) === value
serait vrai. voir MDNMais
new Promise(resolve => resolve(value))
renverrait une nouvelle promesse qui s'est verrouillée pour suivre lavalue
promesse. Il faut une coche supplémentaire pour effectuer le «verrouillage».L'
tick 1
.then
appel serait lancé en premier.Références:
la source