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 6
com 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 then
s e catch
es 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.