如果多个调用者返回一个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()
时,是否有某种方法可以获得此行为?在实践中,它变得越来越难看。
答案 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
。