Я потратил время, чтобы воспроизвести его в песочнице, но, наконец, обнаружил, что проблема связана с инициализацией вашего BehaviorSubject
. Первое значение bsResource
равно []
. Таким образом, в вашем *ngIf
, когда канал async
подписывается на него, он получает значение []
, которое является правдивым, поэтому *ngIf
мгновенно истинно и никогда не вызывает блок else (загрузка).
Все, что вам нужно сделать, это инициализировать BehaviorSubject
с нулевым значением (и затем исправить код, используя его, чтобы быть нулевым):
private bsResource: BehaviorSubject<string[]> = new BehaviorSubject(null);
И когда вы используете его :
const cachedValue = this.bsResource.getValue();
if (!cachedValue || cachedValue.length === 0) {
this.fetchResourceList().subscribe(res => this.bsResource.next(res));
}
Я говорю это снова, вы не должны использовать Promises
, использовать .subscribe
, который работает так же, как toPromise().then
. Вы никогда не должны использовать Promise. .toPromise
полезно только при обновлении Angular, где большая часть кода использует Promises
и не хочет обновлять весь код сразу.