【发布时间】:2020-11-07 16:34:55
【问题描述】:
下午好,
我正在努力在 ngOnInit 中放置函数。如果我正确理解出了什么问题,问题似乎是当我在 ngOnInit 中放置异步函数并且下一个函数取决于第一个的完整执行时,如果第一个尚未完成,那么我需要的数据仍然是未定义,它将失败。
我想做的很简单,真的。 ngOnInit 通过查询我的 API 来填充两个数组。一个是与用户关联的组,另一个是所有组(这些来自数据库)。然后它将通过比较这两个数组来填充第三个数组(allgroups - groups associated = groupsavailable)。
在初始填充之后,我希望能够根据用户交互在数组之间进行进一步比较。这些功能有效,但大约 10% 的情况下,我会收到一个未定义的问题,可以通过刷新页面(有时是两到三遍)来解决。这向我表明这是一个操作顺序的问题。
我该如何继续前进?我可以使这些函数调用同步吗?我可以以某种方式将它们链接在一起吗?
感谢您的帮助。
相关代码如下:
NGONIT 和三个函数:
ngOnInit(): void {
this.populatePickListUserAssociatedGroups();
this.populateOriginalUserAssociatedGroups();
this.populateAvailableGroups();
}
// METHODS
private populatePickListUserAssociatedGroups = () => {
this.userDataService.getSingleUserAssociatedGroups()
.then(groups => this.pickListUserAssociatedGroups = groups)
.then(groups1 => this.originalUserAssociatedGroups = groups1);
}
private populateOriginalUserAssociatedGroups = () => {
this.userDataService.getSingleUserAssociatedGroups().then(groups => this.originalUserAssociatedGroups);
}
private populateAvailableGroups = () => {
this.userDataService.getAllGroups()
.then(groups => this.allGroups = groups)
.then(groups => groups.filter(i1 => !this.originalUserAssociatedGroups
.some(i2 => i1.id === i2.id)))
.then(groups => this.availableGroups = groups);
}
我已经描述了我的主要问题,但我还有另一个问题。由于某种原因,这两个数组:pickListUserAssociatedGroups 和 originalUserAssociatedGroups 总是一起变化。这违背了目的。选择列表数组表示用户更改的内容(我正在使用 ngPrime 选择列表),而 originalUserAssociatedGroups 应该保持不变并表示数据库中的内容,因此我可以稍后在两者之间进行比较。
希望这很清楚。
提前致谢。
【问题讨论】:
-
在 Angular 中使用 Rxjs 运算符而不是 Promise。使用运算符让您的生活更轻松。
标签: javascript angular typescript asynchronous ngoninit