使用Lodash _.once函数时的竞态条件问题及解决方案咨询
问题解答
第二次调用fetch的返回值
当第二个任务并发调用fetch时,会直接返回第一个myRealFetch调用所返回的Promise实例。
Lodash的_.once对异步函数的处理逻辑是:
- 第一次调用时,执行原函数
myRealFetch,并缓存它返回的Promise - 后续所有调用,不管第一次的Promise是否已完成,都会直接返回这个缓存的Promise
哪怕第二个任务在myRealFetch还在执行(5秒耗时过程中)就调用fetch,它拿到的也是同一个Promise。等5秒后这个Promise状态变更时,两个任务里的result都会获取到同一个最终结果。
是否有内置处理方式?
_.once本身就内置了这种并发场景的处理——它不会重复执行原函数,而是复用同一个异步结果的Promise,天然避免了并发调用导致的重复执行问题。当前代码的写法已经能保证myRealFetch只会被执行一次,所有后续调用都共享它的异步结果,不需要额外做其他处理。
内容的提问来源于stack exchange,提问作者Tomergt45
相关产品推荐
相关产品推荐

