我正在使用yahoo-fantasy库发出请求并从Yahoo接收数据。要向Yahoo请求,我们必须首先具有访问令牌。访问令牌会在1小时后过期,并且必须使用Yahoo刷新。刷新时,我们向Yahoo发送刷新令牌,Yahoo向我们发送新的访问令牌。
此库的作者具有内置功能,如果令牌过期,它将刷新令牌。刷新令牌后,可通过自定义回调访问新令牌信息,并在该回调中对其进行处理(持久化到数据库等)。问题在于它不尝试使用新令牌来发出原始请求。我希望它具有这种行为,因此每当我进行函数调用时,我都会收到正确的数据。
与刷新令牌有关的异步行为发生在模块的内部。因此,我不确定在调用回调后如何重试。
我的问题是:解决这个问题的最佳方法是什么?我尝试了两种可能的解决方案。
获取访问令牌后,将其与接收令牌的时间持久保存到数据库中
只要我们希望使用访问令牌,请确定它是否已过期(超过60分钟)
如果这样刷新并返回令牌
如果不返回预先存在的令牌
使用此访问令牌发出我们的请求
在发出请求之前检查有效期限,从而无需重试请求
允许回调作为局部变量与yahoo模块交互
调用回调时,设置新的访问令牌
1或2秒后重试初始请求(需要等待以确保已设置令牌)
const YahooFantasy = require('yahoo-fantasy');
const callback = (result) => {
accessToken = result.access_token;
yf.setUserToken(accessToken);
}
const yf = new YahooFantasy(
clientKey,
clientSecret,
callback
);
yf.setUserToken(
accessToken
);
yf.setRefreshToken(
refreshToken
)
const delay = ms => new Promise(res => setTimeout(res, ms));
getGames = async () => {
let data;
try {
data = await yf.user.games();
} catch (err) {
await delay(2000)
data = await yf.user.games();
console.log(data)
}
}
getGames();
问题:
我已经实现并正在运行解决方案1,但是我担心我可能没有充分利用该库已经提供的功能。
问题