JSON.stringify делает массив объектов пустым - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь получить некоторые данные, отфильтровать их, построить массив объектов и затем преобразовать их в строку. я вставил в console.logs, чтобы выяснить, что происходит безрезультатно!

log 1: [7] // массив с 7 объектами в нем

log 2: "[]" // это строковая версия, только две скобки

log 3: [0] // после его анализа он перезапускает пустой массив.

Мне нужен массив в stingform, чтобы сохранить его в AsyncStorage.

Это для реактивного приложения, которое должно быть «поддерживающим» приложением к существующему решению .NET.

Это мой выбор:

fetchCallHistory = async () => {
    let calls = [];
    try {
        const granted = await PermissionsAndroid.request(
            PermissionsAndroid.PERMISSIONS.READ_CALL_LOG,
            {
              title: "Call Log Example",
              message: "Access your call logs",
              buttonNeutral: "Ask Me Later",
              buttonNegative: "Cancel",
              buttonPositive: "OK"
            }
        );

      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
          CallLogs.load(200).then(function(history) {
              let todayMinus10 = new Date().getTime() - 864000000;
              let filterDate = history.filter(history => {
                  return parseInt(history.timestamp) >= `todayMinus10;`;
              });
              let filterByType = filterDate.filter(history => {
                  return history.rawType < 3;
              });
              for (let i = 0; i < filterByType.length; i++) {
                  calls.push(filterByType[i]);
              }
            });
      } else {
          console.log("Call Log permission denied");
      }
    } catch (error) {
        console.log(error);
    }

    console.log("log 1: ");
    console.log(calls);

    return (stringifiedCalls = JSON.stringify(calls));
};

вот где я это называю:

async componentDidMount() {        
    const callHistory = await this.fetchCallHistory();
    console.log("log 2: ");
    console.log(callHistory);

    let parsedHistory = JSON.parse(callHistory)
    console.log("log 3: ");
    console.log(parsedHistory);

    if (callHistory !== null) {
       this.setState({ callLogs: callHistory, isLoading: false });
    }
}

ожидаемый результат: log 1: [7] // массив с 7 объектами в нем

log 2: // массив преобразован в строку со всем ее содержимым

[{"rawType":1,"type":"INCOMING","dateTime":"17. jun. 2019 09:11:19","timestamp":"1560755479695","name":null,"duration":2698,"phoneNumber":"########"}, ..... ]

log 3: [7] // тот же массив, с которого я начал

фактический результат: log 1: [7] // массив с 7 объектами в нем

log 2: "[]" // это строковая версия, только две скобки

log 3: [0] // после разбора возвращает пустой массив. РЕДАКТИРОВАТЬ: это не должно быть проанализировано здесь на данный момент, он настроен сейчас для тестирования

1 Ответ

1 голос
/ 05 июля 2019

Вы используете асинхронное ожидание обычным способом при разрешенном блоке кода Ниже код должен это исправить.

const history = await CallLogs.load(200);
let todayMinus10 = new Date().getTime() - 864000000;
let filterDate = history.filter(history => {
  return parseInt(history.timestamp) >= `todayMinus10;`;
});
...

Ваша функция fetchCallHistory является асинхронной функцией, которая должна создать массив вызовов и вернуть его после 2-х асинхронных операций (получение разрешения, загрузка истории вызовов). Вы создавали массив вызовов перед этими двумя асинхронными операциями, как и должно быть. Но, не дожидаясь завершения операции CallLogs.load и заполнения массива вызовов, вы возвращали пустой массив.

Итак, ваш ордер на выполнение был примерно таким:

  • создание звонков
  • запрос на разрешение
  • ожидание результата разрешения запроса (с помощью операции await)
  • запрос разрешения восстановлен
  • создать обещание получить логи, но не ждать (здесь ошибка)
  • журнал, журнал
  • ответные звонки
  • выполнить метод обратного вызова CallLogs.load (потому что он был в стеке, ожидал результата. Вы не ожидали этой операции, следовательно, ошибка)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...