@Component({
selector: 'note-consultant',
template: '<div>
<div>{{patientInformation}}</div>
<textarea #textElemRef></textarea>
<button (click)="onSave()">Done</button>
</div>'
})
export class NoteConsultantComponent implements OnInit, AfterViewInit {
recentResponse:any;
patientInformation:any;
@ViewChild('textElemRef') textElemRef: ElementRef;
ngAfterViewInit(): void {
fromEvent(this.textElemRef.nativeElement, 'keyup').pipe(
map((event: any) => {
return event.target.value;
})
,debounceTime(1000)
).subscribe((text: string) => {
let request = this.buildRequestItem(text);
this.patientService.saveProblemNotes(request).subscribe((resp: any) => {
if (resp.error) {
console.log(resp.error);
return;
}
//update response in temp variable...
this.recentResponse = resp.problemText;
}
});
}
onSave() {
if (this.recentResponse != null) {
//when clicking save button update DOM
this.patientInformation = this.recentResponse;
}
//Reset temp variable
this.recentResponse = null;
}
}
У меня есть сценарий, когда пользователь вводит текст, который мне нужно нажать на API и сохранить введенные данные. Так как будет неэффективно нажимать на API для каждого нажатия клавиши. поэтому я использовал оператор RxJs fromEvent для устранения дребезга на секунду.
Дело в том, что я не могу обновлять HTML (потому что я упростил HTML здесь, но в моем проекте это сворачиваемая панель, это приведет к исчезновению нескольких элементов HTML, чего я не хочу) при вводе данных. Вот причина Я сохраняю ответ во временной переменной «recentResponse» и после нажатия кнопки «Сохранить» обновляю HTML.
Но проблема здесь в том, что если пользователь печатает очень быстро и нажимает кнопку «Сохранить», это занимает несколько секунд, пока подписка не будет завершена, до тех пор, пока «recentResponse» не будет определен, поэтому «patientInformation» никогда не будет обновляться (так же, как и HTML).
Как я могу дождаться завершения подписки внутри onSave()? Мне нужно подождать, пока 'recentResponse' не ответит.