Printing Problem es-419 Explainer

Explicación de Problema de imprimir

Objetivo de este acertijo:
Leer un mensaje de error impreso desde el bloque catch, y corregir el error.

Tutorial de la solución:
La declaración try…catch agregada a La lista carece de puerros está capturando un error e imprimiéndolo. Este es el mensaje de error:

> Cannot read property 'kilos' of undefined

En los acertijos anteriores, La lista carece de puerros y Peso raro, corregimos algunos errores. Veamos la línea final en el bloque try:

ingredients.forEach(printIngredient());

Mira la definición de la función printIngredient():

function printIngredient(ingredient) {
  print(ingredient.kilos + ' kilos ' + ingredient.name);
}

La función forEach espera un argumento de una función de devolución de llamada. Pero ten en cuenta que, en vez de pasarla una función de devolución de llamada, el código realmente ejecuta printIngredient() y pasa el resultado a forEach(). printIngredient() espera un argumento, pero no hay ninguno. Por ello, el código crea un error. Si el parámetro ingredient no está definido, el código no puede acceder a la propiedad kilos.

Simplemente elimina la llamada de la función y cambiala por la función de devolución de llamada printIngredient. Puedes ver que esta vez no hay paréntesis. Ahora, en lugar de ejecutar la función printIngredient() una vez sin argumentos, se ejecutará para cada elemento de ingredients, pasando el elemento como argumento. Ahora el código puede encontrar las propiedades que espera.

Solución del código de ejemplo:
(Pulsa a continuación 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 que se ejecuta antes del código del acertijo):

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: ',
    }
);
2 Likes