Лучше всего использовать операторы interval
и switchMap
.
Сначала верните наблюдаемое из функции refreshToken. Используйте оператор map для выполнения всех других вещей, таких как преобразование данных, сохранение в localalstorage и т. Д. В методе refreshToken()
.
import { interval, pipe } from 'rxjs';
import { map, switchMap } from 'rxjs/operators';
.....
refreshToken(token: string) {
const tokenJson: any = {'token': token};
return this.http.post('/api-token-refresh/', tokenJson, httpOptions);
};
checkingTokenOnInterval(){
const intervalTime = 4*60*1000;
const token = 'sdfsdf';
interval(intervalTime).pipe(switchMap(() => this.refreshToken(token))).subscribe(()=>{
//do something
});
}
Используйте checkingTokenOnInterval()
для вызова вызова refreshToken каждые 4 минуты.
Мне нравится решение этой проблемы Джимми Богардом. В своем блоге он опубликовал сообщение под названием «Проверка сущности с посетителями и методами расширения» , в котором он представляет очень элегантный подход к проверке сущности, предполагающий реализацию отдельного класса для хранения кода проверки.
public interface IValidator<T>
{
bool IsValid(T entity);
IEnumerable<string> BrokenRules(T entity);
}
public class OrderPersistenceValidator : IValidator<Order>
{
public bool IsValid(Order entity)
{
return BrokenRules(entity).Count() == 0;
}
public IEnumerable<string> BrokenRules(Order entity)
{
if (entity.Id < 0)
yield return "Id cannot be less than 0.";
if (string.IsNullOrEmpty(entity.Customer))
yield return "Must include a customer.";
yield break;
}
}
Вместо того, чтобы полагаться IsValid(xx)
вызовы на всем протяжении Вашего приложения, рассмотрите слушать некоторый совет от Greg Young:
никогда не позволяют Вашим объектам войти в недопустимое состояние.
то, Что это в основном означает, - то, что Вы переходите от размышления об объектах как чистые контейнеры данных и больше об объектах с поведениями.
Рассматривают пример адреса человека:
person.Address = "123 my street";
person.City = "Houston";
person.State = "TX";
person.Zip = 12345;
Между любым из тех вызовов Ваш объект недопустим (потому что у Вас были бы свойства, которые не соглашаются друг с другом. Теперь рассмотрите это:
person.ChangeAddress(.......);
все вызовы, касающиеся поведения изменения адреса, являются теперь атомарной единицей. Ваш объект никогда не недопустим здесь.
при взятии этой идеи смоделировать поведения, а не состояние, затем можно достигнуть модели, которая не позволяет недопустимые объекты.
Для хорошего обсуждения этого, проверьте это интервью infoq: http://www.infoq.com/interviews/greg-young-ddd
Я обычно использую класс спецификации, он предоставляет метод (это - C#, но можно перевести его на любом языке):
bool IsVerifiedBy(TEntity candidate)
Этот метод выполняет полную проверку кандидата и ее отношений. Можно использовать аргументы в классе спецификации для создания, он параметризовал, как уровень проверки...
можно также добавить метод для знания, почему кандидат не проверил спецификацию:
IEnumerable<string> BrokenRules(TEntity canditate)
можно просто решить реализовать первый метод как это:
bool IsVerifiedBy(TEntity candidate)
{
return BrokenRules(candidate).IsEmpty();
}
Для нарушенных правил, я обычно пишу итератор:
IEnumerable<string> BrokenRules(TEntity candidate)
{
if (someComplexCondition)
yield return "Message describing cleary what is wrong...";
if (someOtherCondition)
yield return
string.Format("The amount should not be {0} when the state is {1}",
amount, state);
}
Для локализации, необходимо использовать ресурсы, и почему бы не передать культуру методу BrokenRules. Я помещаю это классы в образцовое пространство имен с именами, которые предлагают их использование.