javascript - 多个调用者可以使用 Babel await 关键字订阅同一个异步函数吗?

标签 javascript async-await babeljs es6-promise

多个调用者可以订阅一个正在进行的函数,如果它返回一个 CommonJS promise:

let curWaitTask;
let lastWaitTime = new Date(1970, 0, 1);
let func1 = function() {
  if(curWaitTask) {
    return curWaitTask;
  }
  if((new Date() - lastWaitTime) > TWENTY_MINUTES) {
    lastWaitTime = new Date();
    curWaitTask = func2().then(func3).then(func4);
    return curWaitTask;
  }
}

以上是过期缓存的做法。在 20 分钟缓存过期后第一次调用 func1 将导致服务执行另一个异步操作来更新缓存。与此同时,可能会发生对 func1 的其他调用,这将等待相同的缓存更新操作,而不是一次又一次地发生,直到缓存被设置(连续多次,由于所有调用)。

有没有什么方法可以在使用 Babel await 关键字而不是一串笨拙的 .then() 提供的清晰度的同时获得这种行为?在实践中,它变得越来越丑陋。

最佳答案

只需将“笨拙的 then 链”包装在 async 函数 中并在其中使用 await 即可:

let curWaitTask;
let lastWaitTime = new Date(1970, 0, 1);
function func1() {
  if (!curWaitTask && (new Date() - lastWaitTime) > TWENTY_MINUTES) {
    lastWaitTime = new Date();
    curWaitTask = doTask();
  }
  return curWaitTask;
}
async function doTask() {
  return func4(await func3(await func2()));
}

async function 中(幸运的是?)不可能引用从当前调用创建的新 promise,因此使用 async function func1 不是这里真的很明智。

关于javascript - 多个调用者可以使用 Babel await 关键字订阅同一个异步函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40143451/

相关文章:

javascript - 如何使用确认警报并返回 AJAX promise ?

c# - ASP.NET MVC 中的 HttpClient 单例实现

javascript - ES6 模块、babel/webpack。导入/导出语句不起作用

reactjs - Babel 命令行不转译 import 语句 - React

javascript - ES6模块: imported constants are undefined at first; they become available later

javascript - 检测你在 JavaScript 上的哪个页面?

javascript - Jquery 函数在 chrome 和 edge 中工作,但 IE 抛出错误

javascript - RNCryptor IOS + Javascript 加密/解密 AES 256

c# - 在不使用 .Result 的情况下如何在 C# 中不能异步的方法中调用异步方法

.net - 异步等待处理程序死锁