【发布时间】:2021-09-08 02:23:50
【问题描述】:
我有两个组件使用服务共享数据:
export class ShareDataService {
msg: BehaviorSubject<string>;
constructor(
) {
this.msg = new BehaviorSubject("Default Message")
}
changeMessage(message: string) {
this.msg.next(message)
}
}
第一个组件用作路由器,当我单击一个名称时,它会使用其 ID 重定向到该名称的配置文件。我导入了我在上面创建的共享数据服务,当单击一个名称时,它会触发 de sendData() 函数,该函数获取单击元素的 id 并将其作为参数传递给 service changeMessagge() 函数:
constructor(
private _data: ShareDataService
) { }
message: string = "";
ngOnInit(): void {
this._data.msg.subscribe(new_msg => this.message = new_msg)
}
sendData() {
var self = this
$("ul.users-list").on("click", ".user", function(event) {
self._data.changeMessage(event.target.id)
});
}
}
之后,当它重定向到新组件时,这个新组件也会从服务中导入数据:
message: string = "";
constructor(
private _http: HttpClient,
private _data: ShareDataService,
private _router: Router
) { }
async ngOnInit() {
this._data.msg.subscribe(new_msg => this.message = new_msg)
await new Promise(r => setTimeout(r, 1)); // Sleeps 1ms so it can load message
if (this.message === "Default Message") { // Returns to landing if no user loaded
this._router.navigateByUrl("/landing");
return
}
this._http.get<UserInterface>(`https://jsonplaceholder.typicode.com/users/${this.message}`)
.subscribe((data: UserInterface) => this.user = data)
}
如您所见,它订阅了服务并获取了messagge 的值,当我单击另一个组件上的名称时,该值应该已更改。问题是,它首先没有检测到更改,我必须使用新的 Promise() 函数让它休眠 1ms,以便它可以从服务加载新的消息值,然后继续。有什么方法可以让它等待订阅完成加载新消息而不使用 Promise 1ms?已经尝试在分配消息后将代码放入订阅中。
【问题讨论】:
标签: javascript html angular async-await routes