最佳答案
我的代码中有一个由 setInterval 运行的异步函数。这个函数定期更新一些缓存。
我还有一个不同的同步函数,它需要检索值——最好是从缓存中检索,但如果是缓存丢失,则从数据源检索 (我认识到以同步方式进行 IO 操作是不明智的,但是让我们假设在这种情况下需要这样做)。
我的问题是,我希望同步函数能够等待来自异步函数的值,但是不可能在非 async
函数中使用 await
关键字:
function syncFunc(key) {
if (!(key in cache)) {
await updateCacheForKey([key]);
}
}
async function updateCacheForKey(keys) {
// updates cache for given keys
...
}
现在,通过将 updateCacheForKey
中的逻辑提取到一个新的同步函数中,并从两个现有函数中调用这个新函数,可以很容易地规避这个问题。
我的问题是,为什么一开始就绝对要阻止这个用例?我唯一的猜测是它与“防白痴”有关,因为在大多数情况下,从同步函数等待异步函数是错误的。但是,我认为它有时会有其有效的用例,这种想法是错误的吗?
(我认为在 C # 中使用 Task.Wait
也可以做到这一点,尽管这里可能会有些混淆)。