Estoy usando bluebird y veo dos formas de resolver funciones sincrónicas en una Promise, pero no entiendo las diferencias entre ambas formas. Parece que el stacktrace es un poco diferente, por lo que no son solo un alias
, ¿verdad?
Entonces, ¿cuál es la forma preferida?
Camino A
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
Camino B
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
javascript
promise
bluebird
Pipo
fuente
fuente
Promise.resolve
es solo azúcar.Respuestas:
Al contrario de ambas respuestas en los comentarios, hay una diferencia.
Mientras
es básicamente lo mismo que
hay una sutileza.
Las funciones de devolución de promesas generalmente deben tener la garantía de que no deben lanzar de forma síncrona, ya que pueden lanzar de forma asincrónica. Para evitar resultados inesperados y condiciones de carrera, los lanzamientos generalmente se convierten en rechazos devueltos.
Con esto en mente, cuando se creó la especificación, el constructor de la promesa es seguro.
¿Y si
someObject
esundefined
?Bluebird vio esto y Petka agregó
Promise.method
para abordar este problema para que pueda seguir usando valores de retorno. Entonces, la forma correcta y más fácil de escribir esto en Bluebird es en realidad ninguna de las dos, es:Promise.method convertirá los lanzamientos en rechazos y los retornos a resoluciones por ti. Es la forma más segura de hacer esto y asimila
then
ables a través de valores de retorno, por lo que funcionaría incluso sisomeObject
de hecho es una promesa.En general,
Promise.resolve
se utiliza para convertir objetos y promesas extranjeras (thenables) en promesas. Ese es su caso de uso.fuente
Promise.resolve()
es un anti-patrón?Promise.resolve()
Crea una nueva instancia dePromise
la misma forma que usanew
? Si no,return Promise.resolve(yourCode)
sería más rápido y evitaría los tiros sincrónicos.Promise.coroutine
cuál es aún más útil.Hay otra diferencia que no se menciona en las respuestas o comentarios anteriores:
Si
someObject
es unPromise
,new Promise(resolve)
costaría dos tick adicionales.Compare dos fragmentos de código siguientes:
El segundo fragmento imprimiría "tick 3" en primer lugar. ¿Por qué?
Si el valor es una promesa,
Promise.resolve(value)
devolvería el valor exactamente.Promise.resolve(value) === value
sería cierto. ver MDNPero
new Promise(resolve => resolve(value))
devolvería una nueva promesa que se ha cerrado para seguir lavalue
promesa. Se necesita una marca adicional para hacer el "bloqueo".La
tick 1
.then
llamada se ejecutaría primero.Referencias:
fuente