Я ищу некоторые мнения / решения о том, как изящно обрабатывать асинхронный поиск данных.
При асинхронной инициализации любого класса с некоторыми данными я использовал такой подход:
class SomeClass {
// Turning off ts compiler's strictPropertyInitialization
private someProperty: SomeType
public async init(): Promise<this> {
this.someProperty = await goAndGetDataFromWhoKnowsWhere();
return this;
}
public async aMethod(): Promise<AType> {
// do its thing
}
public async anotherMethod(): Promise<AnotherType> {
// do its thing
}
}
И ожидайте, что пользователь (я / другой сотрудник) будет использовать этот класс следующим образом:
const someResult = new SomeClass()
.init()
.then( thatClass => thatClass.aMethod() )
Этот подход, безусловно, подходит для этой цели, но нет никаких жестких ограничений, чтобы гарантировать, что init()
вызывается. Иногда, когда кто-то забывает об этом, вещи ломаются
Возможно, мы могли бы включить strictPropertyInitialization
и внедрить проверку в каждом методе класса. Это сработало бы наверняка, но идентичные строки в методах кричат, что, возможно, есть лучший способ.
class SomeClass {
private someProperty: SomeType | undefined // To enforce null-checking
public async init(): Promise<this> {
this.someProperty = await goAndGetDataFromWhoKnowsWhere();
return this;
}
public async aMethod(): Promise<AType> {
if (!this.someProperty) await this.init();
// do its thing
}
public async anotherMethod(): Promise<AnotherType> {
if (!this.someProperty) await this.init();
// do its thing
}
}
Есть ли решения этой проблемы? Какие-либо шаблоны проектирования, которые работают вокруг этой проблемы? Помогает ценится! :)