多个调用者可以订阅一个正在进行的函数,如果它返回一个 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/