【发布时间】:2020-05-23 11:12:14
【问题描述】:
@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 效率很低。所以我使用了'fromEvent' RxJs 操作符来消除抖动。
问题是我无法更新 HTML(因为我在这里简化了 HTML,但在我的项目中它是一个可折叠面板,它会导致一些我不想要的 HTML 元素消失)当我输入数据时这就是我将响应存储在临时变量“recentResponse”中并在单击“保存”按钮时更新 HTML 的原因。
但这里的问题是,如果用户输入非常快并单击“保存”按钮,订阅完成需要几秒钟,直到那时“recentResponse”未定义,因此“耐心信息”永远不会得到更新(HTML 也是如此)。
如何在 onSave() 中等待订阅完成?我需要等到 'recentResponse' 有一些响应。
【问题讨论】:
-
您可以使用 RxJs 延迟运算符Delay,这是该运算符的常见用例之一,示例是类似的东西
标签: angular typescript rxjs observable rxjs-subscriptions