如何在for循环中使用observable subscription angular 7
How to use observable subscription in forloop angular 7
我有一个数组用户:
[0: {id:123, firstname:'xyz', lastname:'abc'}, 1:{id:456, firstname:'foo', lastname:'bar'}, 3:{id:567, firstname:'bar', lastname:'baz'}]
我必须遍历这个数组并调用服务 API 来获取用户约会。
方法 1 我觉得这不是最佳实践但解决了问题
let userAppointments = []
for (let user of this.users) {
this._service
.getUsersAppointments(
{
date: this.todayDate,
id: user.id
},
this.token
)
.subscribe(res => {
// Modifying array as per requirements-----
userAppointments.push({
id: user.id,
name: `${user.firstname} ${user.lastname}`,
appointments: res
});
});
}
this.appointments = userAppointments
方法 2: 使用 forkJoin
问题:当我最终收到所有呼叫的响应时,我无法访问用户的名字和姓氏。我需要我的最终数组 this.appointments 中的这些详细信息,即在我分配 res to this.appointments
的地方调用订阅之后
forkJoin(
this.users
.map(res =>
this._service.getUsersAppointments(
{
date: this.todayDate,
id: res.id
},
this.token
)
)
.map(response => response)
).subscribe(res => {
// how can I access 'user object' keys like: firstname, id here--------------
this.appointments = res;
});
如果我的问题不清楚,请告诉我。
参考 and codereview question 方法 2
forkJoin 当所有 Observable 传入它时只发射一次 complete.It 发射一个数组,其元素是每个 Observable 在完成之前发射的值的结果。发出的 Array 的一个关键特征是元素的序列与构造 forkJoin 时传递的 Observables 的序列相同(类似于 Promise.all())。这很好地解决了您手头的问题。
您可以遍历 forkJoin 的结果,对于每个索引,从用户数组中选择相应的元素并将用户属性分配给结果对象。
虽然这可以直接在上面方法 2 的订阅调用中完成。更好的解决方案是将此代码移动到使用 Observable.create 方法创建的新 Observable 中。这将阻止您在订阅 forkJoin(ed) Observable 的任何地方编写迭代逻辑。我在这个 stackblitz demo here 中重新创建了相同的场景。检查控制台以获得所需的输出。
我有一个数组用户:
[0: {id:123, firstname:'xyz', lastname:'abc'}, 1:{id:456, firstname:'foo', lastname:'bar'}, 3:{id:567, firstname:'bar', lastname:'baz'}]
我必须遍历这个数组并调用服务 API 来获取用户约会。
方法 1 我觉得这不是最佳实践但解决了问题
let userAppointments = []
for (let user of this.users) {
this._service
.getUsersAppointments(
{
date: this.todayDate,
id: user.id
},
this.token
)
.subscribe(res => {
// Modifying array as per requirements-----
userAppointments.push({
id: user.id,
name: `${user.firstname} ${user.lastname}`,
appointments: res
});
});
}
this.appointments = userAppointments
方法 2: 使用 forkJoin
问题:当我最终收到所有呼叫的响应时,我无法访问用户的名字和姓氏。我需要我的最终数组 this.appointments 中的这些详细信息,即在我分配 res to this.appointments
forkJoin(
this.users
.map(res =>
this._service.getUsersAppointments(
{
date: this.todayDate,
id: res.id
},
this.token
)
)
.map(response => response)
).subscribe(res => {
// how can I access 'user object' keys like: firstname, id here--------------
this.appointments = res;
});
如果我的问题不清楚,请告诉我。
参考
forkJoin 当所有 Observable 传入它时只发射一次 complete.It 发射一个数组,其元素是每个 Observable 在完成之前发射的值的结果。发出的 Array 的一个关键特征是元素的序列与构造 forkJoin 时传递的 Observables 的序列相同(类似于 Promise.all())。这很好地解决了您手头的问题。 您可以遍历 forkJoin 的结果,对于每个索引,从用户数组中选择相应的元素并将用户属性分配给结果对象。 虽然这可以直接在上面方法 2 的订阅调用中完成。更好的解决方案是将此代码移动到使用 Observable.create 方法创建的新 Observable 中。这将阻止您在订阅 forkJoin(ed) Observable 的任何地方编写迭代逻辑。我在这个 stackblitz demo here 中重新创建了相同的场景。检查控制台以获得所需的输出。