angular - Observables:创建一个模拟 http 请求
问题描述
我正在尝试使用 observables 在没有后端 api 的情况下测试我的前端代码。在我的组件模板中,我有一个 textarea。最终我需要使用 http.post 将 textarea 内容发送到后端 api 并接收回内容的验证。
在我的 component.ts 的构造函数中,我定义了一个 observable,它执行一些非常基本的检查并在 2000 毫秒超时后创建模拟结果(如 http.post/http.get):
private obsVal: Observable < any >;
private obsChange: Observable < any >;
constructor() {
this.obsVal = Observable.create(observer => {
setTimeout(() => {
let errorInfo = {};
let val = Math.floor(Math.random() * 10) + 1;
if (val < 6) {
errorInfo['error'] = true;
errorInfo['info'] = "Error! Unknown expression encountered.";
} else {
errorInfo['error'] = false;
}
observer.next(errorInfo);
}, 1000)
});
在 textarea 内的任何更改都会调用以下函数(创建另一个 observable 并订阅它):
textarea.on('change', () => {
this.obsChange = Observable.create(observer => {
observer.next("some text inside textarea");
})
this.obsChange.pipe(
debounceTime(400),
distinctUntilChanged(),
switchMap((text) => {
return this.obsVal
})
)
.subscribe(errorResp => {
this.addPanel(errorResp)
});
})
addPanel
在文档中添加一个 DOM 元素以显示响应。
我使用了 debounceTime、distinctUntilChanged 和 switchMap,以便在用户连续键入时只呈现最新的请求。但是,管道中的这些运算符似乎无法正常工作,因为我一个接一个地收到所有响应。
当然,我在这里犯了一些重大的概念错误。有人可以指出吗?
注意: textarea 元素是在组件内部动态创建的,因此我无法访问(change)="doSomething()"
此事件。
更新: 我试图像这篇文章一样更新我的代码。
我没有在每次更改时都传递订阅,而是创建了一个主题并在 ngOnInit() 中调用它的订阅:
ngOnInit() {
this.subscription = this.obsChange.pipe( //obsChange is the subject
debounceTime(400),
distinctUntilChanged(),
switchMap((text) => {
return this.obsVal
})
)
.subscribe(errorResp => {
this.addPanel(errorResp)
});
}
在更改事件上,我没有创建一个新的 obsChange 可观察对象,而是将 next() 调用到现有对象:
textarea.on('change', () => {
this.obsChange.next("some text");
})
这是第一次工作,但在进一步更改时调用 next() 但它不会触发 ngOnInit() 中的 obsChange。
解决方案
推荐阅读
- amazon-web-services - 如何从 CloudFormation 中的另一个堆栈导入现有的 S3 存储桶?
- c++ - 在 C++ 中按列对二维数组进行排序
- c++ - Is it legal to return reference to an InputIterator internal state?
- matlab - matlab中数据的衰减率
- excel - 使用两个范围组合两个 SUMIF 语句
- python - Plyer 通知在 android 上不起作用
- java - Spring Cloud Config Server 是硬编码路径的有效解决方案吗?
- flutter - 颤振如何在顶部修复容器
- python - 如何在没有关闭驱动程序的情况下关闭 selenium 中的 target = _blank 页面?
- amazon-web-services - amazon-ssm-agent 在 Windows Server 2019 实例上重新启动后无法重新启动