【发布时间】:2022-01-16 03:57:02
【问题描述】:
情况
我有一个异步函数,需要 ~X seconds 来解析。持续时间取决于网络延迟,因此无法预测。该功能由用户输入触发(想想“将当前表单值保存到服务器”)
我想阻止这个函数同时运行多次。
我还想对函数的调用“排队”,以便在适当的时候调用。
问题
(A)“耐心”异步函数的概念是否有一个术语。
(B) 是否有一种工具(类似于debounce)可以采用异步函数并将其转换为“耐心”函数。
【问题讨论】:
-
为什么过度设计?为此分配一个承诺但未分配,并让函数为该承诺分配一个实际值。然后,只要承诺尚未解决,就不要在后续调用中重新分配它。至于名称:不是真的,它基本上是您在寻找一种适用于您的用例的锁定模式。有很多方法可以做到这一点,但 promise 有他们的决心,所以你不妨利用它。
-
感谢!我确实最终做了类似的事情,但它更复杂,因为我确实需要调用在等待期间发出的“最近”保存请求。这几乎是一种反向去抖动的情况。我承认我很惊讶没有实用程序存在,因为在用户交互时将前端值保存到服务器似乎是一个非常常见的用例!
-
我有一个 NPM 包可以做到这一点,检查
async-await-queue,你必须设置一个并发 1 和 0 最小等待的队列。它还支持优先级。 -
为什么这会让事情变得更复杂?
let mostRecent; function doSave() { if (!mostRecent) mostRecent = new Promise((resolve, reject) => { when you resolve, also set mostRecent to underfined });完成了吗?可能是时候在您的问题中显示实际代码,简化为最小形式但不简化为人工用例,确保它仍然反映您需要做的事情。 -
例如参见stackoverflow.com/a/70326711/1048572 或stackoverflow.com/a/64955723/1048572。我还没有遇到过这方面的标准术语。
标签: node.js asynchronous npm promise