我正在尝试获取一些数据,对其进行过滤,构建一个对象数组,然后对其进行字符串化。我放了一些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] //解析之后,它返回一个空数组。编辑:这不是在这里进行解析,它现在已经设置用于测试
答案 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操作完成并填充调用数组,就可以返回空数组。
因此,您的执行顺序如下: