вызов следующего наблюдателя во второй раз, похоже, не работает - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь смоделировать момент ожидания, когда пользователь должен ждать (в настоящий момент имитируется) внутреннего вызова. Когда появляется момент ожидания, я хочу, чтобы кнопки были отключены, и чтобы было показано сообщение. Я пытаюсь добиться этого с помощью следующего кода.

При нажатии кнопки этот фрагмент кода выполняется в службе:

//Simulate waiting for backend
this.calculatingObserver.next(true);
console.log("disabled");
await (new Promise(resolve => setTimeout(resolve, 2000)));
this.calculatingObserver.next(false);
console.log("enabled");

Это выполняется, когда я вижу журналы консолипоявляются.

Это подпись наблюдателя:

private calculatingObserver: Observer<boolean> = null;

И вот как я получаю наблюдаемое для него:

public get Calculating$(): Observable<boolean> {
    return new Observable((calculatingObserver: Observer<boolean>) => {
        this.calculatingObserver = calculatingObserver;
    });
}

В моем компоненте я портирую этонаблюдаемый для нового свойства

//In the component class
Calculating$: Observable<boolean>;

//in ngOnInit
this.Calculating$ = this._calculateService.Calculating$;

И в HTML-коде компонента я использую для проверки следующее свойство:

Calculating: {{Calculating$ | async}}

Когда я тестирую код, изначально вычисление неset (пустая строка). Когда я нажимаю кнопку, я вижу, что Калькуляция меняется на true. Но тогда оно никогда не меняется на ложное. Таким образом, кажется, что во время выполнения

this.calculatingObserver.next(false);

что-то идет не так, и я не могу понять, почему. Что я делаю не так, и почему вычисление не меняется на ложное?

Время ожидания работает, так как требуется 2 секунды, прежде чем в консоли будет напечатано «включено».

1 Ответ

0 голосов
/ 11 октября 2019

Я попробовал ваш код в стеке и изменил код в вашем сервисе так:

this.calculatingObserver.next(true); console.log("disabled"); setTimeout(() => {this.calculatingObserver.next(false);console.log("enabled");}, 2000);

, и похоже, он работает следующим образом: https://stackblitz.com/edit/angular-2afnv9

...