Estou usando o bluebird e vejo duas maneiras de resolver funções síncronas em uma promessa, mas não entendo as diferenças entre as duas maneiras. Parece que o stacktrace é um pouco diferente, então eles não são apenas um alias
, certo?
Então, qual é a forma preferida?
Caminho A
function someFunction(someObject) {
return new Promise(function(resolve) {
someObject.resolved = true;
resolve(someObject);
});
}
Caminho B
function someFunction(someObject) {
someObject.resolved = true;
return Promise.resolve(someObject);
}
javascript
promise
bluebird
Pipo
fonte
fonte
Promise.resolve
é apenas açúcar.Respostas:
Ao contrário de ambas as respostas nos comentários - há uma diferença.
Enquanto
é basicamente o mesmo que
existe uma sutileza.
As funções de retorno de promessa geralmente devem ter a garantia de que não devem ser lançadas de forma síncrona, pois podem ser lançadas de forma assíncrona. Para evitar resultados inesperados e condições de corrida - os lançamentos são geralmente convertidos em rejeições devolvidas.
Com isso em mente - quando a especificação foi criada, o construtor de promessa está seguro.
E se
someObject
forundefined
?Bluebird viu isso e Petka acrescentou
Promise.method
para resolver esse problema para que você possa continuar usando valores de retorno. Portanto, a maneira correta e mais fácil de escrever isso no Bluebird é, na verdade, nenhuma das duas - é:Promise.method irá converter lances em rejeições e retornos em resoluções para você. É a maneira mais segura de fazer isso e assimila
then
habilidades por meio de valores de retorno para que funcione mesmo quesomeObject
seja de fato uma promessa em si.Em geral,
Promise.resolve
é usado para lançar objetos e promessas estrangeiras (thenables) para promessas. Esse é o seu caso de uso.fonte
Promise.resolve()
é um antipadrão ?Promise.resolve()
uma nova instância dePromise
da mesma maneira que usanew
? Caso contrário,return Promise.resolve(yourCode)
seria mais rápido e evitaria lançamentos síncronos.Promise.coroutine
que é ainda mais útil.Há outra diferença não mencionada pelas respostas ou comentários acima:
Se
someObject
for umPromise
,new Promise(resolve)
custaria dois carrapatos adicionais.Compare os dois seguintes snippet de código:
O segundo trecho imprimiria 'tick 3' primeiro. Por quê?
Se o valor for uma promessa,
Promise.resolve(value)
retornaria o valor exatamente.Promise.resolve(value) === value
seria verdade. veja MDNMas
new Promise(resolve => resolve(value))
retornaria uma nova promessa que travou para seguir avalue
promessa. É necessária uma marcação extra para fazer o 'bloqueio'.A
tick 1
.then
chamada seria executada primeiro.Referências:
fonte