React Native使用expo-calendar调用getEventsAsync返回异常及报错咨询
解决方案
核心问题点
Calendar.getEventsAsync()是异步Promise方法,你调用时没有添加await关键字,方法未执行完成就读取返回值,拿到的是处于pending状态的Promise对象,就是你打印的特殊结构。- 没有异常捕获逻辑,异步调用抛出错误时无处理逻辑,会触发未处理的Promise拒绝报错。
- 需确认传入的
calIDs参数为日历ID组成的数组,哪怕仅查询单个日历也要包裹为数组格式,否则会触发原生方法参数校验异常。
修改后代码
useEffect(() => { (async () => { try { // 申请日历访问权限 const { status } = await Calendar.requestCalendarPermissionsAsync(); if (status === "granted") { const calendars = await Calendar.getCalendarsAsync( Calendar.EntityTypes.EVENT ); // 打印设备上所有携带ID的日历列表 console.log("Here are all your calendars:"); console.log({ calendars }); // 注意calIDs必须为日历ID组成的数组,单个日历请传 [目标日历ID] 格式 // 添加await等待异步方法执行完成,获取实际事件数据 const events = await Calendar.getEventsAsync( calIDs, "2021-04-14T17:00:00.00Z", "2021-09-14T17:00:00.00Z" ); // 此时可正常打印事件数据 console.log("EVENTS:", events); } } catch (err) { // 捕获所有异步异常,可根据打印的错误信息排查后续参数/权限问题 console.log("获取日历事件失败:", err); } })(); }, []);
补充说明
你打印得到的{"_U":0,"_V":0,"_W":null,"_X":null}是React Native环境下未完成状态的Promise对象的内部字段,添加await等待异步执行完成后即可拿到实际返回的事件数组。如果调整后仍有报错,catch块中打印的错误信息会明确提示具体问题原因,比如参数格式错误、权限缺失等。
内容的提问来源于stack exchange,提问作者Matt Laszcz
相关产品推荐
相关产品推荐

