首页 > 解决方案 > 仅当我不使用调试器时应用程序崩溃。无法克服的局面。我应该怎么办?

问题描述

我正面临一个我自己无法克服的非常丑陋的问题,我就是不明白。

我的应用目的的简短摘要:您可以在周围找到食物并向餐馆老板下订单。

我编写了一个辅助函数,它允许我根据其时间表“horarioSemanal”属性决定餐厅是开放还是关闭。

此函数将从 firestore 查询的餐馆作为参数,并在某些条件下决定它应得的属性“disponible”(可用)的值。

问题是它工作得很好!太好了,我通过 expo 发布了更改,并且由于 expo 有无线更新,而且我的应用程序在 apptore 和 Google play 中都有,它覆盖了我的所有用户……</p>

在我删除更改之前,我的用户都无法使用我的应用程序,因为我无法检测到问题。在我的模拟器中它可以 100% 运行,但是当应用程序部署时几乎立即崩溃。

测试、测试和测试我终于找到了这个问题,但我仍然无法弄清楚我到底应该怎么做才能克服这种情况。

该应用程序在我使用 js 调试器时运行良好!但是当我关闭这个我写的新模块时不起作用。

我录制了一段视频,这样你就可以在屏幕上看到我正在观看的内容:

https://www.youtube.com/watch?v=x9-t8-3XzKc

这是我调度动作的动作:

import { restaurantesHorarioValidado, validaDisponibilidadComidas } from '../../src/3-ResultadosComponents/Librerias/DisponibilidadHorario';

export const searchResultsInLocation = (ubicacion) => {
  const db = firebase.firestore();
  const docRef = db.collection('Restaurantes').where('abierto', '==', true).where(`zonaOperativa.zonaConsulta.${ubicacion}`, '==', true).get();
  const restaurantesIDS = [];
  return (dispatch) => {
    const holder = [];
    dispatch({
      type: BUSQUEDA_DE_RESULTADOS,
    });
    docRef.then(querySnapshot => {
      querySnapshot.forEach(doc => {
        holder.push(doc.data());
        restaurantesIDS.push(doc.data().id);
      });
      dispatch({
        type: DESCARGA_RESTAURANTES_ABIERTOS,
        restaurantes: restaurantesHorarioValidado(holder)
      });
    })
    .then(() => {
      const comidasRefs = [];
      restaurantesIDS.forEach(restaurant => {
        const ref = db.collection('Comidas').where('restaurantID', '==', `${restaurant}`).get();
        comidasRefs.push(ref);
      });
      return Promise.all(comidasRefs).then(results => {
        const comidas = [];
        results.forEach(resto => {
          resto.forEach(comida => comidas.push(comida.data()));
        });
        dispatch({
          type: DESCARGA_COMIDAS,
          comidas: validaDisponibilidadComidas(comidas, restaurantesHorarioValidado(holder))
        });
      })
      .then(() => dispatch({
            type: BUSQUEDA_DE_RESULTADOS,
          }))
      .catch(err => console.log('error; ', err));
    });
  };
};

下面是 reducer 处理动作的方式:

case DESCARGA_COMIDAS:
  return { ...state, comidas: action.comidas };
case DESCARGA_RESTAURANTES_ABIERTOS:
  return { ...state, restaurantes: action.restaurantes };

这是我编写的模块,我用来创建动作创建者发送的对象:

const diasDeSemana = ['Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado'];
const today = new Date().getDay();

const hoyAbre = (horario) => {
  if (horario) {
    const JornadaHoy = horario.find(jornada => jornada.dia == diasDeSemana[today]);
    return JornadaHoy;
  }
  return false;
};

export const isRestaurantAvalaible = (horario) => {
  const Today = new Date();

  if (hoyAbre(horario)) {
    //Si el restaurant abre hoy
      //Evalua si está abierto
    const horarioApertura = () => {
      const nuevoDia = new Date(`${Today.getFullYear()}, ${Today.getMonth() + 1} ${Today.getDate()} ${hoyAbre(horario).horario.apertura}:00`);
      return nuevoDia;
    };

    const horarioCierre = () => {
      //Si horario de cierre es hoy
      const nuevoDia = new Date(`${Today.getFullYear()}, ${Today.getMonth() + 1} ${Today.getDate()} ${hoyAbre(horario).horario.cierre}:00`);
      //Si el horario de cierre de hoy es pasado las 00:00
      const cierraTomorrow = new Date(`${Today.getFullYear()}, ${Today.getMonth() + 1} ${Today.getDate() + 1} ${hoyAbre(horario).horario.cierre}:00`);

      if (nuevoDia.getHours() <= 8) {
        return cierraTomorrow;
      }
      return nuevoDia;
    };

    const isNowOpen = Today.getTime() >= horarioApertura().getTime();

    const isNowClosed = Today.getTime() >= horarioCierre().getTime();

    //Si está abierto
    if (isNowOpen && !isNowClosed) {
      return { estado: 'abierto' };
    }

    //Si abre mas rato
    if (hoyAbre(horario) && (Today.getTime() < horarioApertura())) {
      return { estado: 'abre pronto', horarioApertura: horarioApertura() };
    }

    //Si ya cerró
    if (isNowOpen && isNowClosed) {
      return { estado: 'ya cerro', horarioCierre: horarioCierre() };
    }
  }

  //Si hoy no abre
  if (!hoyAbre(horario)) {
    return { estado: 'No abre hoy' };
  }
};

export const restaurantesHorarioValidado = (restaurantes) => {
  const restaurantesModificados = restaurantes.map(restaurant => {
    return { ...restaurant, disponible: isRestaurantAvalaible(restaurant.horarioSemanal) };
  });
  const restaurantesAbiertos = restaurantesModificados.filter(restaurant => restaurant.disponible.estado == 'abierto');
  const restaurantesProximosAbrir = restaurantesModificados.filter(restaurant => restaurant.disponible.estado == 'abre pronto');
  const restaurantesCerrados = restaurantesModificados.filter(restaurant => restaurant.disponible.estado == ('ya cerro' || 'No abre hoy'));

  return [...restaurantesAbiertos, ...restaurantesProximosAbrir, ...restaurantesCerrados];
};

export const validaDisponibilidadComidas = (comidas, restaurantes) => {
  //Se le agrega la propiedad "disponible" del restaurant dueño
  const comidasModificadas = comidas.map(comida => {
    const Owner = restaurantes.find(restaurant => restaurant.id == comida.restaurantID);
    return { ...comida, disponible: Owner.disponible };
  });

  const comidasDisponibles = comidasModificadas.filter(comida => comida.disponible.estado == 'abierto');
  const comidasProximosAbrir = comidasModificadas.filter(comida => comida.disponible.estado == 'abre pronto');
  const comidasNoDisponibles = comidasModificadas.filter(comida => comida.disponible.estado == ('ya cerro' || 'No abre hoy'));

  return [...comidasDisponibles, ...comidasProximosAbrir, ...comidasNoDisponibles];
};

这是我关闭 js 调试器后得到的错误:

[Unhandled promise rejection: TypeError: undefined is not an object (evaluating 'restaurant.disponible.estado')]

Stack trace:
  src/3-ResultadosComponents/Librerias/DisponibilidadHorario.js:65:98 in <unknown>
  src/3-ResultadosComponents/Librerias/DisponibilidadHorario.js:65:62 in restaurantesHorarioValidado
  store/actions/2-ResultadosActions.js:55:50 in <unknown>
  node_modules/promise/setimmediate/core.js:37:14 in tryCallOne
  node_modules/promise/setimmediate/core.js:123:25 in <unknown>
  ...

正如它所暗示的那样,我尝试让这些功能作为承诺工作存在一些错误。错误消失了,但我没有找回对象......

问题是,当调试器打开而不是关闭时,这到底是如何工作的?

我该怎么做才能恢复我的生活?

标签: react-nativereduxexpo

解决方案


推荐阅读