【发布时间】:2019-12-27 18:28:33
【问题描述】:
我有一个react-native 应用程序,它使用react-navigation。有一个带有按钮单击处理程序的功能组件。
我最近遇到了async/await 的问题。我在非异步方法中调用了异步方法,但它没有按预期工作。我对其进行了一点调试,发现调用了 async 方法并完成了它应该做的所有事情,但之后更改就丢失了。
非异步方法如下所示:
const handleDone = () => {
api.events.removeEventFromCache(eventId);
navigation.navigate(routes.Events);
};
调用该方法时,会从缓存中删除一个对象,并将用户导航到另一个屏幕。 api.events.removeEventFromCache(eventId) 被调用并成功完成,我什至检查缓存以查看对象已被删除。问题是在navigation.navigate(routes.Events) 之后它突然还在缓存中。
添加 async/await 关键字解决了问题,但我不太明白为什么:
const handleDone = async () => {
await api.events.removeEventFromCache(eventId);
navigation.navigate(routes.Events);
};
我虽然它会做所有事情而不等待结果但是为什么结果消失了?这不是关于执行顺序和等待结果的问题。我并不真正关心结果,我只是希望它完成。
这是没有关键字的日志:
--> in cache now 3
remove the event from cache
navigate to events
cache length before remove 3
--> in cache now 3
cache length set 2
cache length checked 2
--> in cache now 3
带有关键字的日志:
--> in cache now 3
remove the event from cache
cache length before remove 3
cache length set 2
cache length checked 2
navigate to events
--> in cache now 2
是的,执行上有区别,但我的问题是关于缓存中的结果。
【问题讨论】:
-
异步意味着它在不同的时间做某事——异步。因此,如果您执行
asyncRemoveX(); getX(),第二行仍将返回您,无论X是什么,因为asyncRemoveX未完成 - 它将在稍后完成。这就是await存在的原因 - 顾名思义,它 等待 异步函数完成,因此await asyncRemoveX()将保证在下一行完成。 -
Async/Await 语法本质上为您提供了一种替代方法来编写没有回调的异步代码。您的异步函数转换为:
api.events.removeEventFromCache(eventId).then(navigation.navigate()) -
我添加了日志。最后几行有不同的结果。
-
据我了解,导航方法将缓存的副本传递给导航事件。创建副本并丢弃前一个副本。在第一种情况下,您的应用程序在仍然有事件时复制缓存并将其发送到导航功能。您的 api 方法正在编辑的缓存副本已删除您的事件,但不再使用该副本。在第二种情况下,您的导航函数接收更新的缓存。希望对您有所帮助。
标签: javascript react-native async-await react-navigation