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回调方法(因为这是在堆栈中,等待结果。你没有等待这个操作,因此错误)
我正在尝试获取一些数据,对其进行过滤,构建一个对象数组,然后将其字符串化。我输入了一些 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回调方法(因为这是在堆栈中,等待结果。你没有等待这个操作,因此错误)