JSON.stringify使对象数组为空

时间:2019-07-05 11:10:03

标签: javascript arrays json react-native asyncstorage

我正在尝试获取一些数据,对其进行过滤,构建一个对象数组,然后对其进行字符串化。我放了一些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 });
    }
}

预期结果: 日志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] //与我开始的数组相同

实际结果: 日志1:[7] //包含7个对象的数组

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

log 3:[0] //解析之后,它返回一个空数组。编辑:这不是在这里进行解析,它现在已经设置用于测试

1 个答案:

答案 0 :(得分:1)

您在授予权限的代码块中以奇怪的方式使用async等待 下面的代码应该可以解决它。

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

您的函数'fetchCallHistory'是一个异步函数,该函数需要创建一个calls数组,并在2次异步操作(获取许可权,加载调用历史记录)后返回它。 您应该在这两个异步操作之前创建调用数组。但是,无需等待CallLogs.load操作完成并填充调用数组,就可以返回空数组。

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

  • 创建通话
  • 请求权限
  • 等待请求许可结果(通过await操作)
  • 请求权限已撤消
  • 创建获取日志承诺,但不要等待(这里有误)
  • 日志,日志
  • 回拨电话
  • 执行CallLogs.load回调方法(因为它在堆栈中,正在等待结果。您没有在等待此操作,因此会出现错误)