angular - 在 2 秒内执行第二个请求作为第一个请求
问题描述
我有两个要求。
我需要this.auth.login
在执行后 2 秒内this._auth.create
执行。
这不会发生在我身上。
我做错了什么?
auth() {
this._auth.create(this.form.value).subscribe(
() => {
setTimeout(() => {
this._auth.login(this.form.value).subscribe(
() => {
this.router.navigate(['/home']);
},
error => {
this._toast.error(error.error.message);
}
);
}, 2000)
},
error => {
this._toast.error(error.error.message);
}
)
}
解决方案
尽量避免嵌套订阅。相反,您可以使用 RxJS运算符来混合和匹配多个(相互依赖的)可观察对象。
尝试以下
auth() {
this._auth.create(this.form.value).pipe(
delay(2000),
switchMap(_ => this._auth.login(this.form.value))
).subscribe(
_ => this.router.navigate(['/home']),
error => this._toast.error(error.error.message)
);
}
我使用delay
运算符将通知从第一个请求延迟 2 秒,然后使用switchMap
运算符将其切换到第二个请求。
但是在登录过程中引入固定延迟并不是好的设计。如果您在此延迟期间需要满足一些副作用,另一种方法是将这些副作用包含在路由过程中,并使第二个呼叫直接等待第一个呼叫而不是硬延迟。
推荐阅读
- python - 进程中发送的函数不能改变类字段的值
- c# - 没有属性的类继承
- javascript - AngularJS 热敏打印
- git - cPanel 中的 GIT 存储库连接失败
- javascript - 理解 javascript 中的 XHR 请求对象...(困惑)
- javascript - 如何在循环中创建正则表达式?
- php - 如何在 Symfony 3.4 中将 json 反序列化为具有关系的实体?
- apache-flink - Apache Flink:每台机器的 TaskManager 数量
- vb.net - 嵌套水晶报表出错**子报表不支持**
- spring-boot - 如何在spring boot中正确实现apache shiro的ehcache并与ehcache一起使用spring?