Como encadear promises

Escrito por

Na dica de hoje, vamos continuar falando sobre promises. Vou mostrar um detalhe na promise que é bastante interessante: como podemos encadear promises, ou seja, vincular uma promise à outra.

Para poder fazer isso funcionar, vamos começar importando nosso tão usado FS, já que ele é sempre uma chave para isso e em seguida vamos criar uma função readFile, que vai ser uma arrow function. Nós passamos para ele um path de um arquivo e ele vai retornar uma promise nova:

1const fs = require("fs")
2
3const readFile = file => {
4 return new Promise((resolve, reject) => {
5 fs.readFile(file, (err, contents) => {
6 if (err) {
7 reject(err)
8 } else {
9 resolve(contents.toString())
10 }
11 })
12 })
13}

Consideramos que quem vai receber o conteúdo da nova promise queira esse conteúdo em string. Vamos fazer também um writeFile, que também irá passar um file, e um contents, que vai retornar uma nova promise:

1const writeFile = (file, contents) => {
2 return new Promise((resolve, reject) => {
3 fs.writeFile((file, contents), err => {
4 if (err) {
5 reject(err)
6 } else {
7 resolve()
8 }
9 })
10 })
11}

O nosso problema agora é que precisamos ler um arquivo e passar para o write, então precisamos fazer o seguinte:

1readFile("promises.js").then(contents => console.log(contents))

Ao mandar rodar o arquivo, perceba que ele retorna o nosso código em string, a vantagem disso é que agora conseguimos 'encavalar' uma promise depois da outra. A primeira alternativa que temos é utilizar o then dessa forma, então precisamos colocar o próprio writeFile:

1readFile("promises.js").then(contents => writeFile("tst.js", contents))

Essa é a primeira maneira que temos de encadear as promises. Ao rodar o arquivo, perceba que foi criado um tst.js como queríamos. A segunda forma é colocarmos encadeado realmente:

1readFile("promises.js").then(writeFile("tst.js", contents))

Vamos dizer a ele para ler o nosso arquivo e em seguida escrever um outro arquivo, o problema é que se fizermos dessa forma, quando ele passar 'parseando' o código, ele já vai executar esse primeiro writeFile, se não estivéssemos passando um file, poderíamos fazer isso direto, mas como isso não acontece, temos que utilizar o bind, pois ele vai criar uma nova função, a onde eu posso passar o contexto que eu quero executar essa função e fazer um curring fixando alguns atributos da esquerda para a direita:

1readFile("promises.js").then(writeFile.bind(null, "tst2.js"))

A grande dica é entender como funciona isso. Podemos colocar um then após o outro, podemos fazer um novo teste:

1const out (contents) => {
2 return new Promise(resolve =>{
3 setTimeout(() => {
4 console.log(contents)
5
6 resolve()
7 }, 2000)
8 })
9}

Com isso, caso a gente queira fazer um teste no then, podemos fazer o seguinte:

1readFile("promises.js")
2 .then(out)
3 .then(() => console.log("final"))

Retornando as promises nós conseguimos encadear, essa é uma grande vantagem em relação a um callback, afinal conseguimos fazer o código crescer para baixo ao invés de crescer para frente, evitamos o callback hell.

Confira o video:

Deixe suas dúvidas e sugestões nos comentários. Curta o DevPleno no Facebookinscreva-se no canal e não se esqueça de cadastrar seu e-mail para não perder as novidades.  Abraço!

Evolua mais rápido

Junte-se a milhares de desenvolvedores no nosso time de alunos premium e alcance mais rápido o próximo nível da sua carreira.

Ver cursos Premium