问题
I don't quite figure out how to adapt this approach in order to generate dynamic timer observables.
Concretly, I've two methods:
GetAccessToken()
RefreshAccessToken()
Both returns a OAuth2AccessTokenResponse
:
public class OAuth2AccessTokenResponse
{
private string tokenType;
private string accessToken;
private int expiresIn;
private string refreshToken;
private int refreshtokenExpiresIn;
}
So, I need to refresh the current accesstoken before expiresIn
property value in seconds elapses.
I've tried to make my approach but I've not been able to get anything with sense:
this.accessTokenObservable = Observable
.Generate(
this.GetAccessToken(),
resp => true, //?????
resp => resp, //?????
resp => resp, //?????
resp => TimeSpan.FromSeconds(this.RefreshAccessToken().ExpiresIn) //?????
);
Sequencially:
response = this.GetAccessToken()
- Before
response.ExpiresIn
expires ->response = this.RefreshAccessToken()
- Go to
2.
GetAccessToken
and RefreshAccessToken
code:
internal OAuth2AccessTokenResponse GetAccessToken()
{
return new OAuth2AccessTokenResponse() {ExpiresIn = new Math.Random().Next(3,11)};
}
internal OAuth2AccessTokenResponse RefreshAccessToken()
{
return new OAuth2AccessTokenResponse() {ExpiresIn = new Math.Random().Next(3,11)};
}
回答1:
After fixing a few compile errors, this seems to work for me:
void Main()
{
var accessTokenObservable = Observable
.Generate(
this.GetAccessToken(),
atr => true,
atr => this.RefreshAccessToken(),
atr => atr,
atr => TimeSpan.FromSeconds(atr.ExpiresIn)
);
accessTokenObservable.Subscribe(x => Console.WriteLine(x.ExpiresIn));
}
internal OAuth2AccessTokenResponse GetAccessToken()
{
Console.WriteLine("!");
return new OAuth2AccessTokenResponse() { ExpiresIn = rnd.Next(3, 11) };
}
internal OAuth2AccessTokenResponse RefreshAccessToken()
{
Console.WriteLine("+");
return new OAuth2AccessTokenResponse() { ExpiresIn = rnd.Next(3, 11) };
}
private Random rnd = new Random();
public class OAuth2AccessTokenResponse
{
private string tokenType;
private string accessToken;
private int expiresIn;
private string refreshToken;
private int refreshtokenExpiresIn;
public int ExpiresIn;
}
I get a result like this:
! 10 + 10 + 3 + 9 +
来源:https://stackoverflow.com/questions/46465215/reactive-refresh-accesstoken-using-observables