Используя ваш пример, доступный на stackblitz, я создаю наблюдаемую копию, которая будет повторять то же поведение обещания.
import { delay, tap } from 'rxjs/operators';
...
disabled = false;
send() {
this.disabled = true;
this.myObservable().pipe(
delay(200),
tap(() => this.disabled = false)
).subscribe();
}
private myObservable() {
const observable = Observable.create(observer => {
observer.next({});
observer.complete();
});
return observable;
}
Однако, если вы хотите добавить задержку к вашему наблюдаемому методу, называемому validateAdminCredentials
, Вы можете добавить оператор задержки:
import { delay, tap } from 'rxjs/operators';
...
this.bSignIn = true;
let formData = new FormData();
formData.append('Email', this.loginForm.get('Email').value);
formData.append('Password', this.loginForm.get('Password').value);
this.disabled = true;
this.usersService.validateAdminCredentials(formData)
.pipe(
delay(3000), // simulating a HTTP request
tap(() => this.disabled = false) // after HTTP request, disable is false
)
.subscribe(res => {
this.bSignIn = false;
let auxRes: any = res;
...
В другой руке вы можете использовать функцию myObservable()
в своем потоке с оператором switchMap
:
import { switchMap, delay, tap } from 'rxjs/operators';
this.myObservable().pipe(
delay(3000),
switchMap(() => this.usersService.validateAdminCredentials(formData),
tap(() => this.disabled = false),
)
)
.subscribe(res => {
this.bSignIn = false;
let auxRes: any = res;
...
private myObservable() {
const observable = Observable.create(observer => {
observer.next({});
observer.complete();
});
return observable;
}
Вы можете прочитать о Rx js и узнайте о его операторах.