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

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

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

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

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

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

Ни один из моих пользователей не мог использовать мое приложение, пока я не удалил изменения, потому что мне не удалось обнаружить проблему. В моем симуляторе он работал на 100%, но когда приложение было развернуто, почти мгновенно вылетало.

Тестирование, тестирование и тестирование Я наконец подхожу к проблеме, но все еще не могу понять, что, черт возьми, мне делать, чтобы преодолеть эту ситуацию.

Приложение, пока я использую отладчик js, работает отлично! но когда я выключил этот новый модуль, я написал, что он не работает.

Я записал видео, чтобы вы могли видеть то же, что и я, на своем экране:

https://thewikihow.com/video_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.info('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>
  ...

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

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

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

Проблема, вероятно, связана с асинхронным действием, которое завершается вовремя, когда у вас включен отладчик, но не может этого сделать при работе на высокой скорости (объект еще не существует, когда вы пытаетесь получить к нему доступ). На самом деле это довольно распространенная проблема.

Jared Smith 25.10.2018 03:50

Я так и думал. Я пробовал приведенные выше примеры как обещания, но безуспешно. Теперь я свяжу все как обещания и попробую еще раз. Спасибо за ответ @JaredSmith!

Felipe Font 25.10.2018 15:23
Умерло ли Create-React-App?
Умерло ли Create-React-App?
В этом документальном фильме React.dev мы исследуем, мертв ли Create React App (CRA) и какое будущее ждет этот популярный фреймворк React.
Освоение React Native: Пошаговое руководство для начинающих
Освоение React Native: Пошаговое руководство для начинающих
React Native - это популярный фреймворк с открытым исходным кодом, используемый для разработки мобильных приложений. Он был разработан компанией...
В чем разница между react native и react ?
В чем разница между react native и react ?
React и React Native - два популярных фреймворка для создания пользовательских интерфейсов, но они предназначены для разных платформ. React - это...
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
От React к React Native: Руководство для начинающих по разработке мобильных приложений с использованием React
Если вы уже умеете работать с React, создание мобильных приложений для iOS и Android - это новое приключение, в котором вы сможете применить свои...
Хуки React: что это такое и как их использовать
Хуки React: что это такое и как их использовать
Хуки React - это мощная функция библиотеки React, которая позволяет разработчикам использовать состояние и другие возможности React без написания...
0
2
48
0

Другие вопросы по теме