Pelo que entendi, uma promessa é algo que pode resolver () ou rejeitar (), mas fiquei surpreso ao descobrir que o código na promessa continua a ser executado depois que uma resolução ou rejeição é chamada.
Considerei resolver ou rejeitar uma versão assíncrona de saída ou retorno, que interromperia toda a execução imediata da função.
Alguém pode explicar por que o exemplo a seguir às vezes mostra o console.log após uma chamada de resolução:
var call = function() {
return new Promise(function(resolve, reject) {
resolve();
console.log("Doing more stuff, should not be visible after a resolve!");
});
};
call().then(function() {
console.log("resolved");
});
javascript
promise
ecmascript-6
es6-promise
Ludwig Van Beethoven
fonte
fonte
resolve()
não é uma instrução de controle JS que magicamente teria o efeito dereturn
, é apenas uma chamada de função e, sim, a execução continua depois dela.Respostas:
JavaScript tem o conceito de "execução completa" . A menos que um erro seja lançado, uma função é executada até que uma
return
instrução ou seu fim seja alcançado. Outro código fora da função não pode interferir nisso (a menos que, novamente, um erro seja lançado).Se você quiser
resolve()
sair da função inicializador, terá que acrescentá-lareturn
:fonte
resolve()
é uma função assíncrona. Como vimos na outra resposta (excluída), algumas pessoas acreditam que a chamadaresolve
gerará retornos de chamada imediatamente.resolve
próprio @Alnitak não é assíncrono, é totalmente síncrono. Apesar de usar estritamente a API ES6, não é observável se é síncrono ou assíncrono.resolve
resultará em quaisquer retornos de chamada registrados sendo imediatamente invocados de forma que façam parte da pilha de chamadas atual. Isso não é verdade, em vez disso, ele apenas enfileira os retornos de chamada (e você está certo, não é assíncrono, mas apenas faz o seu trabalho e termina imediatamente)console.log
aparece às em vez de por que aparece nessa ordem. Até agora, o queresolve
faz e como promete é irrelevante para a forma como interpreto a pergunta. Mas é claro que ainda é importante saber no contexto das promessas. Um dos motivos pelos quais votei positivamente em sua resposta :)Os retornos de chamada que serão invocados quando você
resolve
uma promessa ainda são exigidos pela especificação para serem chamados de forma assíncrona. Isso é para garantir um comportamento consistente ao usar promessas para uma combinação de ações síncronas e assíncronas.Portanto, quando você invoca,
resolve
o retorno de chamada é enfileirado e a execução da função continua imediatamente com qualquer código após aresolve()
chamada.Somente quando o loop de evento JS recebe o controle de volta, o retorno de chamada pode ser removido da fila e realmente invocado.
fonte
EnqueueJob
, que é invocado por.then
.