Javascript stringify使对象数组为空

Javascript stringify使对象数组为空,javascript,arrays,json,react-native,asyncstorage,Javascript,Arrays,Json,React Native,Asyncstorage,我试图获取一些数据,对其进行过滤,构建一个对象数组,然后对其进行字符串化。我输入了一些console.log来找出发生了什么,但没有用 日志1:[7]//包含7个对象的数组 日志2:“[]”//这是字符串化版本,只有两个括号 日志3:[0]//解析后,它将重新返回一个空数组 我需要stingform中的数组将其保存到异步存储 这适用于react本机应用程序,即对现有.NET解决方案的“支持”应用程序 这是我的收获: fetchCallHistory = async () => {

我试图获取一些数据,对其进行过滤,构建一个对象数组,然后对其进行字符串化。我输入了一些console.log来找出发生了什么,但没有用

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

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

日志3:[0]//解析后,它将重新返回一个空数组

我需要stingform中的数组将其保存到异步存储

这适用于react本机应用程序,即对现有.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));
};
预期结果: 日志1:[7]//包含7个对象的数组

日志2://已将数组及其所有内容转换为字符串

[{"rawType":1,"type":"INCOMING","dateTime":"17. jun. 2019 09:11:19","timestamp":"1560755479695","name":null,"duration":2698,"phoneNumber":"########"}, ..... ]
日志3:[7]//与我开始使用的数组相同

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

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


日志3:[0]//解析后返回一个空数组。编辑:此时不在这里进行分析,它现在设置为测试您正在以错误的方式在授予权限的代码块中使用异步等待 下面的代码应该修复它

const history = await CallLogs.load(200);
let todayMinus10 = new Date().getTime() - 864000000;
let filterDate = history.filter(history => {
  return parseInt(history.timestamp) >= `todayMinus10;`;
});
...
您的函数“fetchCallHistory”是一个异步函数,它需要创建一个调用数组,并在两个异步操作(获取权限、加载调用历史记录)后返回该数组。 您在这两个异步操作之前创建了调用数组。但没有等待CallLogs.load操作完成并填充calls数组,您返回的是空数组

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

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

感谢您的快速回复,这解决了我的问题!我不确定区别是什么(除了代码上的明显变化),我只是对答案进行了编辑,并做了更多解释,希望能有所帮助:)@SondreLjovshin
const history = await CallLogs.load(200);
let todayMinus10 = new Date().getTime() - 864000000;
let filterDate = history.filter(history => {
  return parseInt(history.timestamp) >= `todayMinus10;`;
});
...