“Quanto mais você estuda, mais aprende e se aproxima de realizar seu sonhos!”
Sobre o Exercício | Entrega | Licença
Páginas da web não existem sozinhas. Elas carregam imagens, iframes, conteúdo ou recuperam todo tipo de informações de outros lugares que não seus próprios servidores. E depender de algo externo ao seu sistema para fazer algo traz uma problemática: e se o serviço do qual eu dependo sair do ar? E se os servidores dele estiverem lentos? O que acontece com minha página? Numa lógica normal, sequencial de programação, sua página esperaria o serviço dar retorno ou voltar ao ar para continuar. Ou seja, a página ficaria quebrada, ou teria todo o seu carregamento freado em função de um problema totalmente fora do seu controle. Para lidar com esse problema e outros de natureza similar, existe um conceito que é muito poderoso e presente no JavaScript: a assincronicidade. Em vez de o programa ser carregado todo em sequência, uma linha após a outra, linhas que podem trazer esse tipo de problema podem "ficar carregando", enquanto o resto do seu programa executa normalmente. A execução dessa linha, a espera pela disponibilidade desse serviço, corre paralelamente ao desenvolver do restante do código. É uma execução assíncrona. E isso tem muito poder. Pareceu interessante?! Pois bem. Para começar, nesta aula você vai aprender dois conceitos importantes:
- Operações assíncronas;
- callbacks.
-
📌 1. Dado o código abaixo, qual a ordem de finalização de execução das linhas comentadas?;
-
📌 2. Agora, dado o código abaixo, qual a ordem de finalização de execução das linhas comentadas?;
-
📌 3. A função getPlanet abaixo imprime o planeta Marte de forma síncrona. Modifique getPlanet, de forma que Marte seja impresso assincronamente, depois de 4 segundos;
-
📌 4. Suponha que você precise simular uma mensagem enviada do robô Curiosity de Marte para a Terra. O Curiosity envia para a Terra a temperatura atual em Marte, gastando um tempo variável de até 5 segundos para que termine o envio. Crie a função sendMarsTemperature, que imprime a temperatura em Marte;
-
📌 5. Agora que você fez a função que envia a temperatura de Marte, suponha que você consiga enviar para o robô Curiosity o que você deseja fazer, uma vez obtida com sucesso a temperatura em Marte. Logo, adicione na função sendMarsTemperature um callback que contenha as ações a serem tomadas em cima da temperatura;
-
📌 6. Por fim, o robô Curiosity tem uma taxa de sucesso de envio de mensagem de 60% devido ao fato de o robô já estar muito ocupado com outras operações. Logo, adicione na função sendMarsTemperature um outro callback que contenha as ações a serem tomadas em caso de falha.
Dado o código abaixo, qual a ordem de finalização de execução das linhas comentadas?
✏️ Código Javascript
const planetDistanceFromSun = ({ name, distanceFromSun: { value, measurementUnit } }) =>
`${name} is ${value} ${measurementUnit} apart from the Sun`;
const mars = {
name: "Mars",
distanceFromSun: {
value: 227900000,
measurementUnit: "kilometers",
},
};
const venus = {
name: "Venus",
distanceFromSun: {
value: 108200000,
measurementUnit: "kilometers",
},
};
const jupiter = {
name: "Jupiter",
distanceFromSun: {
value: 778500000,
measurementUnit: "kilometers",
},
};
console.log(planetDistanceFromSun(mars)); // A Primeiro
console.log(planetDistanceFromSun(venus)); // B Segundo
console.log(planetDistanceFromSun(jupiter)); // C Terceiro
//A ordem de finalização das linhas comentadas é: A, B e, por fim, C
Agora, dado o código abaixo, qual a ordem de finalização de execução das linhas comentadas?
✏️ Código Javascript
const planetDistanceFromSun = ({
name,
distanceFromSun: { value, measurementUnit },
}) => `${name} is ${value} ${measurementUnit} apart from the Sun`;
const mars = {
name: 'Mars',
distanceFromSun: {
value: 227900000,
measurementUnit: 'kilometers',
},
};
const venus = {
name: 'Venus',
distanceFromSun: {
value: 108200000,
measurementUnit: 'kilometers',
},
};
const jupiter = {
name: 'Jupiter',
distanceFromSun: {
value: 778500000,
measurementUnit: 'kilometers',
},
};
console.log(planetDistanceFromSun(mars)); // A Primeiro
setTimeout(() => console.log(planetDistanceFromSun(venus)), 3000); // B Terceiro
setTimeout(() => console.log(planetDistanceFromSun(jupiter)), 2000); // C Segundo
// A ordem de finalização das linhas comentadas é: A, C e, por fim, B
A função getPlanet abaixo imprime o planeta Marte de forma síncrona. Modifique getPlanet, de forma que Marte seja impresso assincronamente, depois de 4 segundos.
✏️ Código Javascript
const getPlanet = () => {
const mars = {
name: 'Mars',
distanceFromSun: {
value: 227900000,
measurementUnit: 'kilometers',
},
};
// Resolução
setTimeout(() => console.log('Returned planet: ', mars), 4000);
};
getPlanet(); // imprime Marte depois de 4 segundos
Suponha que você precise simular uma mensagem enviada do robô Curiosity de Marte para a Terra. O Curiosity envia para a Terra a temperatura atual em Marte, gastando um tempo variável de até 5 segundos para que termine o envio. Crie a função sendMarsTemperature, que imprime a temperatura em Marte.
✏️ Código Javascript
const messageDelay = () => Math.floor(Math.random() * 5000);
const getMarsTemperature = () => {
const maxTemperature = 58;
return Math.floor(Math.random() * maxTemperature);
};
// crie a função sendMarsTemperature abaixo
const sendMarsTemperature = () => {
setTimeout(() => {
console.log(`Mars temperature is: ${getMarsTemperature()} degree Celsius`);
}, messageDelay());
};
sendMarsTemperature(); // imprime "Mars temperature is: 20 degree Celsius", por exemplo
Agora que você fez a função que envia a temperatura de Marte, suponha que você consiga enviar para o robô Curiosity o que você deseja fazer, uma vez obtida com sucesso a temperatura em Marte. Logo, adicione na função sendMarsTemperature um callback que contenha as ações a serem tomadas em cima da temperatura.
✏️ Código Javascript
const messageDelay = () => Math.floor(Math.random() * 5000);
const getMarsTemperature = () => {
const maxTemperature = 58;
return Math.floor(Math.random() * maxTemperature);
};
const toFahrenheit = (degreeCelsius) => (degreeCelsius * 9) / 5 + 32;
const temperatureInFahrenheit = (temperature) =>
console.log(`It is currently ${toFahrenheit(temperature)}ºF at Mars`);
const greet = (temperature) =>
console.log(
`Hi there! Curiosity here. Right now is ${temperature}ºC at Mars`
);
// definição da função sendMarsTemperature...
const sendMarsTemperature = async (callback) => {
setTimeout(() => callback(getMarsTemperature()), messageDelay());
};
sendMarsTemperature(temperatureInFahrenheit); // imprime "It is currently 47ºF at Mars", por exemplo
sendMarsTemperature(greet); // imprime "Hi there! Curiosity here. Right now is 53ºC at Mars", por exemplo
Por fim, o robô Curiosity tem uma taxa de sucesso de envio de mensagem de 60% devido ao fato de o robô já estar muito ocupado com outras operações. Logo, adicione na função sendMarsTemperature um outro callback que contenha as ações a serem tomadas em caso de falha.
✏️ Código Javascript
const messageDelay = () => Math.floor(Math.random() * 5000);
const getMarsTemperature = () => {
const maxTemperature = 58;
return Math.floor(Math.random() * maxTemperature);
};
const toFahrenheit = (degreeCelsius) => (degreeCelsius * 9) / 5 + 32;
const temperatureInFahrenheit = (temperature) =>
console.log(`It is currently ${toFahrenheit(temperature)}ºF at Mars`);
const greet = (temperature) =>
console.log(
`Hi there! Curiosity here. Right now is ${temperature}ºC at Mars`
);
const handleError = (errorReason) =>
console.log(`Error getting temperature: ${errorReason}`);
// definição da função sendMarsTemperature...
const sendMarsTemperature = (sucessMensage, errorMensage) => {
setTimeout(() => {
Math.random() <= 0.6
? sucessMensage(getMarsTemperature())
: errorMensage('Robot is busy');
}, messageDelay());
};
// imprime "It is currently 47ºF at Mars", por exemplo, ou "Error getting temperature: Robot is busy"
sendMarsTemperature(temperatureInFahrenheit, handleError);
// imprime "Hi there! Curiosity here. Right now is 53ºC at Mars", por exemplo, ou "Error getting temperature: Robot is busy"
sendMarsTemperature(greet, handleError);
Este projeto está licenciado sob a Licença MIT - consulte LICENSE para maiores detalhes.