JSON.stringify 使对象数组为空

JSON.stringify makes Object Array empty

我正在尝试获取一些数据,对其进行过滤,构建一个对象数组,然后将其字符串化。我输入了一些 console.logs 来弄清楚发生了什么但无济于事!

log 1: [7] // 包含 7 个对象的数组

log 2: "[]" // 这是只有两个括号的字符串化版本

log 3: [0] // 解析后返回一个空数组。

我需要 stingform 格式的数组以将其保存到 AsyncStorage。

这是一个反应本机应用程序,即 "supportive" 现有 .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] // 解析后 returns 一个空数组。编辑:此时不在这里解析,现在设置它用于测试

您在已授予权限的代码块中以错误的方式使用异步等待 下面的代码应该可以修复它。

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

您的函数 'fetchCallHistory' 是一个异步函数,它需要创建一个调用数组并在 2 个异步操作(获取权限、加载调用历史记录)后 return 它。 您在这 2 个异步操作之前创建了 calls 数组。但是没有等待 CallLogs.load 操作来完成和填充调用数组,你正在 returning 空数组。

因此,您的执行顺序如下所示:

  • 创建调用
  • 请求许可
  • 等待请求权限结果(通过await操作)
  • 请求权限已返回
  • 创建获取日志承诺但不要等待(此处错误)
  • 日志,日志
  • return 调用
  • 执行CallLogs.load回调方法(因为这是在堆栈中,等待结果。你没有等待这个操作,因此错误)