O javascript é um single thread.
Quando utilizamos requisicões ou leitura de disco o ideal é que seja utilizado o callback das funcões responsáveis por quê é atravéz delas que nosso código fica um asyncrono assim não travando a nossa aplicacão.
Hoje uma forma de fazer um código mais legível é utilizando Promise
O asyn
aguarda o resultado de uma Promise
para executar um código expecífico sem bloquear a thread.
O await
espera o resulado da Promise
para ser executado
No caso abaixo o resultado vai ser atribuído a variável result
esperando primeiro o resultado de readFile
const readFile = (filePath, charset) => new Promise((resolve, reject) => {
fs.readFile(filePath, charset, (err, result) => {
if (err) return reject(err)
resolve(result)
})
})
const read = async () => {
const result = await readFile(path.join(__dirname, '..', 'package.json'), 'utf8')
const dependecies = JSON.parse(result).dependencies)
console.log(myDependencies))
}
Para tratarmos o erro utilizamos o try catch
que é um modo syncrono do JS
const read = async () => {
try {
const result = await readFile(path.join(__dirname, '..', 'package.json'), 'utf8')
const dependecies = JSON.parse(result).dependencies)
console.log(myDependencies))
} catch (error) {
console.log('ERROR:', error)
}
}
Aync pode substituir a forma de ser utilizado o construtor Promise
deixando o código mais legível e atribuindo ele a uma variável como exemplo
readFile(path.join(__dirname, '..', 'package.json'), 'utf8')
.then((result) => JSON.parse(result).dependencies) // como teve o sucesso
.then((myDependencies) => console.log(myDependencies)) // abaixo temos o retorno do primeiro then aqui
.catch((error) => console.log('ERROR: ', error))