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.resolvees 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
someObjectesundefined?Bluebird vio esto y Petka agregó
Promise.methodpara 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
thenables a través de valores de retorno, por lo que funcionaría incluso sisomeObjectde hecho es una promesa.En general,
Promise.resolvese 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 dePromisela misma forma que usanew? Si no,return Promise.resolve(yourCode)sería más rápido y evitaría los tiros sincrónicos.Promise.coroutinecuál es aún más útil.Hay otra diferencia que no se menciona en las respuestas o comentarios anteriores:
Si
someObjectes 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) === valuesería cierto. ver MDNPero
new Promise(resolve => resolve(value))devolvería una nueva promesa que se ha cerrado para seguir lavaluepromesa. Se necesita una marca adicional para hacer el "bloqueo".La
tick 1.thenllamada se ejecutaría primero.Referencias:
fuente