多个呼叫者是否可以使用Babel await关键字订阅相同的异步功能?

时间:2016-10-20 00:07:55

标签: javascript async-await babeljs es6-promise

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

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;
  }
}

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

在使用Babel await关键字提供的清晰度而不是一串笨拙的.then()时,是否有某种方法可以获得此行为?在实践中,它变得越来越难看。

2 个答案:

答案 0 :(得分:2)

只需打包"笨拙的then链"在async function中使用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内部不可能引用从当前调用创建的新承诺,因此在这里使用async function func1并不合理。

答案 1 :(得分:2)

您询问多个呼叫者是否可以订阅相同的异步功能,所以让我们看看我们是否可以在func1内解决此问题并保持异步(在Bergi的帮助下!):< / p>

let curTask;
let lastTime = new Date(1970, 0, 1);

async function func1() {
  if (curTask && (new Date() - lastTime) < 10000) {
    return await curTask;
  }
  return await (curTask = (async () => {
    lastTime = new Date();
    return await func4(await func3(await func2()));
  })());
}

我们可以等待承诺,而不仅仅是异步函数。

我们将工作的内容放在我们没有立即等待的第二个异步函数中,从而得到它的承诺,我们同步初始化curTask