JavaScript 없음을 약속합니다.
7198 단어 codequalitytutorialjavascript
플럭소 어신크로노
O JavaScript é uma linguagem
single-threade
결과
솔루상
콜백
Assim que uma operação for concluída a callback será executada
예:
const fs = require('fs');
fs.readFile('./arquivo.txt', (err, content) => {
if (err) {
console.error(`Erro ao ler o arquivo: ${err.message}`);
return;
}
console.log(`Arquivo lido. Conteúdo: ${content.toString('utf8')}`);});
No codigo acima é utilizado uma
node-style callback
(Node.js의 콜백 기본 형식)O que está acontecendo:
O lado ruim das 콜백:
a necessidade de executar uma coisa dentro da outra
예:
콜백 지옥
const fs = require('fs');
fs.readFile('file1.txt', (err, file1Content) => {
if (err) return console.log(Erro ao ler arquivo 1: ${err.message});
console.log(Lido file1.txt com ${file1Content.byteLength} bytes);
fs.readFile('file2.txt', (err, file2Content) => {
if (err) return console.log(Erro ao ler o arquivo 2: ${err.message});
console.log(Lido file2.txt com ${file2Content.byteLength} bytes);
fs.readFile('file3.txt', (err, file3Content) => {
if (err) return console.log(Erro ao ler o arquivo 3: ${err.message});
console.log(Lido file3.txt com ${file3Content.byteLength} bytes);
});
});
});
Como Mostrado no codigo acima, a legibilidade se torna muito mais complexa devido a necessidade de criar uma callback dentro de outra callback até concluir sua tarefa.
가능한 해결책:
const fs = require('fs');
const file3Callback = (err, file3Content) => {
if (err) return console.log(Erro ao ler o arquivo 3: ${err.message});
console.log(Lido file3.txt com ${file3Content.byteLength} bytes);
};
const file2Callback = (err, file2Content) => {
if (err) return console.log(Erro ao ler o arquivo 2: ${err.message});
console.log(Lido file2.txt com ${file2Content.byteLength} bytes);
fs.readFile('file3.txt', file3Callback);
};
const file1Callback = (err, file1Content) => {
if (err) return console.log(Erro ao ler arquivo 1: ${err.message});
console.log(Lido file1.txt com ${file1Content.byteLength} bytes);
fs.readFile('file2.txt', file2Callback);
};
fs.readFile('file1.txt', file1Callback);
Como tentativa de tornar o codigo mais legível, são criadas varias funções com o único intuito de chamar a próxima callback, apesar de torná-lo um pouco mais legível, ainda não é performático.
약속
A cereja do bolo para as callbacks, melhorando sua legibilidade e deixando seu código muito mais intuitivo.
좋아, mas como essa mágica acontece?
os dois casos a seguir 관찰:
function dividirNumerosSemPromises(num1, num2) {
if (num2 == 0) throw new Error("Não pode ser feito uma divisão por zero");
return num1 / num2;
}
try {
const resultado = dividirNumeros(2, 1);
console.log(`resultado: ${resultado}`);
} catch (e) {
console.log(e.message);
}
Na função síncrona
dividirNumerosSemPromises
o resultado da callback já é tratado dentro da função.function dividirNumerosComPromises(num1, num2) {
const promise = new Promise((resolve, reject) => {
if (num2 == 0) reject(new Error("Não pode ser feito uma divisão por zero"));
const resultado = num1 / num2;
resolve(resultado)
});
return promise;
}
dividirNumeros(2, 1)
.then(result => console.log(sucesso: ${result}))
.catch(err => console.log(erro: ${err.message}));
Agora na função assíncrona
dividirNumerosComPromises
o resultado não é tratado dentro da função, mas sim onde ela está sendo chamada. Assim, com uma mesma função é possível tratar a resposta em inúmeras formas diferentes그런 다음 e 해결 x 캐치 e 거부
Caso não tenha percebido, no segundo caso essas duas palavrinhas são utilizadas, mas o que elas significam?
Estrutura da Promese:
const p = new Promise((resolve, reject) => {
// Aqui é onde vamos realizar a lógica que precisamos
// para "tentar cumprir" a promessa
});
Ao escrevê-la, não se esqueça de utilizar a palavra-chave
new
e da arrow function como parâmetro daPromese
.const fs = require('fs');
function readFilePromise (fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (err, content) => {
if (err) return reject(err);
resolve(content);
});
});
}
Perceba, no exemplo acima estamos utilizando do modulo interno
fs
apenas com o intuito de ilustrar, o Importante aqui é perceber como o resolve
e o reject
são utilizreadFilePromise('./file.txt') // A função me promete que vai ler o arquivo
.then((content) => { // Caso ela cumpra o que prometeu
console.log(Lido arquivo com ${content.byteLength} bytes); // Escrevo o resultado no console
})
.catch((err) => { // Caso ela não cumpra o que prometeu
console.error(Erro ao ler arquivo: ${err.message}); // Escrevo o erro no console
});
Sei que é muita coisa, mas aos pouquinhos você vai pegar o jeito :)
Reference
이 문제에 관하여(JavaScript 없음을 약속합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/juliocesar1402/promeses-no-javascript-3kj0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)