Explicação de Impressão do problema
Objetivo deste desafio:
Ler uma mensagem de erro impressa do bloco de catch e corrigir o erro.
Passo a passo da solução:
O comando try…catch adicionado na lista não tem alho-poró está capturando e imprimindo um erro. Veja a mensagem de erro:
> Cannot read property 'kilos' of undefined
Nos desafios anteriores, alguns erros da Lista não tem alho-poró e Peso estranho foram corrigidos. Assim analise a linha final no bloco try:
ingredients.forEach(printIngredient());
Dê uma olhada na definição da função printIngredient()
:
function printIngredient(ingredient) {
print(ingredient.kilos + ' kilos ' + ingredient.name);
}
A função forEach
espera o argumento de uma função retorno de chamada. Mas observe que em vez de passar uma função retorno de chamada, o código na verdade executa printIngredient()
e passa o resultado para forEach()
. printIngredient()
espera um argumento, mas nenhum é fornecido. É por isso que o código cria um erro. Se o parâmetro ingredient
for indefinido, o código não pode acessar a propriedade kilos
.
Basta remover a chamada de função e substituí-la por uma função retorno de chamada printIngredient
. Observe que não existe nenhum parêntese dessa vez. Agora, em vez de executar a função printIngredient()
uma vez sem nenhum argumento, ela será executada para cada elemento de ingredients
, passando os elementos como argumento. Agora o código pode encontrar as propriedades que ele espera.
Solução do código de exemplo:
(Toque abaixo para revelar)
import {addIngredient} from 'cookbook';
import {itemWeight, totalWeight} from 'debugging';
let ingredients = [
{
name: 'potatoes',
kilos: 4,
},
{
name: 'carrots',
kilos: 2,
},
{
name: 'onions',
kilos: 1,
},
{
name: 'chickens',
kilos: 2,
},
];
let leeks = {name: 'leeks', kilos: 1.5};
function printTotalWeight() {
let total = 0;
for (let i of ingredients) {
total += i.kilos;
}
print('Total ingredient weight: ' + total + ' kilos');
}
function printIngredient(ingredient) {
print(ingredient.kilos + ' kilos ' + ingredient.name);
}
function prepareRecipeCards() {
try {
addIngredient(leeks);
printTotalWeight();
print('Ingredients:');
ingredients.forEach(printIngredient);
} catch (e) {
console.log(e);
}
}
prepareRecipeCards();
Código adicional Código adicional (código oculto executado antes do código do desafio):
function _addIngredient({name, kilos}) {
if (isNaN(kilos)) {
throw new Error(`kilos must be a number. got ${kilos} instead`);
}
ingredients.push({
name,
kilos,
});
console.log(`Added ${name}, ${kilos} kilos, to the ingredients list.`);
}
defineModule(
'cookbook',
{
addIngredient: _addIngredient,
}
);
defineModule(
'debugging',
{
itemWeight: 'Item Weight: ',
totalWeight: 'Total Weight: ',
}
);