Есть функция:
getSome() {
this.http.get('/some')
.subscribe( (data: Array<object>)=> {
console.log(data)
this.AllMaterial = data; // не делает запрос
}, err => {
console.log(err)
})
}
Я должен вызвать ее после проверки в другой функции:
second() {
if (this.isEmpty(this.AllMaterial)) {
this.getSome();
}
console.log(this.AllMaterial)
}
При вызове естественно в косоли: undefined => console.log(this.AllMaterial) somedate => console.log(data)
Как сделать эту конструкцию асинхронной?
Эта конструкция и так асинхронная.
Если не прибегать к использованию операторов RxJS - потоки можно конвертировать в Promise и работать уже с async/await:
getSome() {
return this.http.get('/some').toPromise();
}
async second() {
if (this.isEmpty(this.allMaterial)) {
this.allMaterial = await this.getSome();
}
console.log(this.allMaterial);
}
Без async/await:
import { iif, of } from 'rxjs';
import { tap } from 'rxjs/operators';
getSome() {
return this.http.get('/some').pipe(
tap((allMaterial) => {
this.allMaterial = allMaterial;
})
);
}
second() {
iif(
() => this.isEmpty(this.allMaterial),
this.getSome(),
of(null)
).subscribe(() => {
console.log(this.allMaterial);
});
}
P.S. - мне вариант с async/await нравится больше.
Продвижение своими сайтами как стратегия роста и независимости