Javascript 如何解决在多个异步请求期间刷新api令牌的竞争条件?

Javascript 如何解决在多个异步请求期间刷新api令牌的竞争条件?,javascript,rest,oauth,oauth-2.0,Javascript,Rest,Oauth,Oauth 2.0,有5个异步请求同时运行,命中401响应,它的默认补偿功能是尝试刷新令牌以查看是否可以获得访问权限 问题是,如果有5个异步调用来刷新令牌端点,那么我们在会话中以取消同步的无效令牌结束 这是Redux Saga应用程序,上面有ReactJS。完成这五个请求后,您需要接收某种信号。您可以使用Promise.all来实现这一点,它接受一系列承诺,并在所有承诺都得到履行时予以履行,而在至少一个承诺得到履行时予以拒绝 const asyncRequest1 = makeAsyncRequestPromise

有5个异步请求同时运行,命中401响应,它的默认补偿功能是尝试刷新令牌以查看是否可以获得访问权限

问题是,如果有5个异步调用来刷新令牌端点,那么我们在会话中以取消同步的无效令牌结束


这是Redux Saga应用程序,上面有ReactJS。

完成这五个请求后,您需要接收某种信号。您可以使用
Promise.all
来实现这一点,它接受一系列承诺,并在所有承诺都得到履行时予以履行,而在至少一个承诺得到履行时予以拒绝

const asyncRequest1 = makeAsyncRequestPromise();
const asyncRequest2 = makeAsyncRequestPromise();
const asyncRequest3 = makeAsyncRequestPromise();
const asyncRequest4 = makeAsyncRequestPromise();
const asyncRequest5 = makeAsyncRequestPromise();

const allDone = Promise.all([
    asyncRequest1.then(() => true, () => false),
    asyncRequest2.then(() => true, () => false),
    asyncRequest3.then(() => true, () => false),
    asyncRequest4.then(() => true, () => false),
    asyncRequest5.then(() => true, () => false),
]);


allDone.then((results) => {
    const someHasFailed = results.some(result => result === false);
    if (someHasFailed) {
        // make the refresh token here
    }
});

虽然您的解决方案可以工作,但这不是我可以在我的应用程序中使用的东西,因为它是一个大量的redux传奇样板和ReactJS。请求调用分布在应用程序中的各个文件上,然后另一个解决方案是将这些请求的状态直接存储到redux存储中,这是一个额外的间接寻址,但会创建一个代理对象来协调刷新令牌。如果有一个请求已经在传输中,请等待该请求。或者,如果您不想等待,让代理发送另一个请求,然后让代理决定使用哪个响应(可能是第一次成功),并使用此响应通知代理的所有调用方。