Encadeamento de promessa Js: ordem de execução

Este artigo pode ser útil para você, se:

  • você tem um conhecimento básico das promessas ES6,
  • mas você tem algumas dúvidas sobre como funciona o encadeamento de promessa.

Notação abreviada Promise.resolve ()

const hi = Promise.resolve(6) 

é o mesmo que

const hi = new Promise((resolve, reject) => {
resolve
(6)
})

E nós pode acessar 6com hi.then((value_6))agora.

Ordem de execução da promessa

Enquanto promessas mais altas são executadas, as promessas localizadas mais abaixo (ainda não criadas com new Promise/ Promise.resolve) ficam no estado pendente .

Os thens e catches inferiores começam a execução assim que a promessa com que são cumpridos (valor de retorno de outra promessa, por exemplo Promise.resolve(1), Promise.resolve(2)) é resolvida ou rejeitada .

Promise.resolve(1)
.then(() => {
return Promise.resolve(2);
// when we arrive to this line, const hi = Promise.resolve(2) promise starts execution.
// when :hi is resolved, all thens, that are attached to it, - get fired.
// in our case, only the next :then is attached.
// If :hi got rejected, the closest :catch would get fired.
}).then((value) => {
console
.log(value) //=> 2
return Promise.reject(3)
}).then(() => {
// is never executed
}).catch((value) => {
console
.log(value) //=> 3
return Promise.reject(4)
}).catch((value) => {
console
.log(value) //=> 4
return 5 // same as Promise.resolve(5)
}).then((value) => {
console
.log(value) //=> 5
// notice we returned nothing. same as Promise.resolve(undefined)
}).then((value) => {
console
.log(value) //=> undefined
});

Exemplo do mundo real

fetch('google.com')
.then((response) => {
return response.json(); // converting response to json take some time too, so they made it a promise (so that other code of ours isn't stuck waiting for json convertion). so we are returning a promse.
}).then((jsonedResponse) => {
console
.log(jsonedResponse); // { data: 'someData' }
}).catch((error) => {
// this catch will get executed if either fetch() or json() promises get rejected.
// if we wanted to handle fetch() and json() promise rejections separately, we would place two cathes, with first one coming after fetch().
})

Alguns outros recursos

  • ES6 Promessas em profundidade > Observe onde você direciona suas reações aos assuntos.
  • Cadeias de promessa dinâmicas > Aqui está o problema: uma função de promessa e suas instruções .então, todas retornam promessas. Duh, certo? Mas é importante observar que eles retornam a promessa mais recente.