Сбой приложения, только если я не использую отладчик.Невозможно преодолеть ситуацию.Что я должен делать? - PullRequest
0 голосов
/ 25 октября 2018

Я сталкиваюсь с довольно уродливой проблемой, которую я не могу решить самостоятельно, я просто не понимаю.

Краткое описание цели моего приложения: Вы можете найти еду и сделать заказ в ресторан.Владельцы.

Я написал вспомогательную функцию, которая позволяет мне решать, будет ли ресторан открыт или закрыт, на основании его свойства «horarioSemanal».

Эта функция принимает в качестве аргументов рестораны, запрошенные в пожарном депо, и в зависимости от некоторых условий решает, какое значение свойства «disponible» (avalaible) оно заслуживает.

Дело в том, что оно работает довольноЧто ж!Настолько хорошо, что я опубликовал изменения через expo, и поскольку expo имеет обновления по беспроводной сети, и у меня есть приложение в apptore и google play, оно достигло всех моих пользователей ...

Ни один из моих пользователей не смогиспользовать мое приложение, пока я не удалил изменения, потому что я не смог обнаружить проблему.В моем симуляторе он работал на 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));
    });
  };
};

вот как редуктор обрабатывает действие:

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>
  ...

Поскольку в нем есть ошибка с обещаниями, я попытался заставить эти функции работать как обещания.Ошибки исчезают, но объект не возвращается ...

Вопрос в том, как, черт возьми, это может работать только тогда, когда включен отладчик, а не когда он выключен?

что я должен сделать, чтобы вернуть мою жизнь: (?

Большое спасибо.

...