angular - Promise.all 无法按预期使用数组
问题描述
这是我的代码,我从一个空数组开始,并想调用一个服务来处理填充的数组。我使用对服务的两次调用来填充数组,这些服务调用 API 来接收要插入到数组中的元素。
我正在尝试使用承诺来确保我的数组subscribers
中充满了正确的订阅者对象,但是方法 processSubscribers 总是收到一个空数组,即使对象最终确实被添加到订阅者数组中(如 chrome 调试中所见)。
doSomething(){
const subscribers: ISubscriber[] = [];
const promises = [];
this.selectedChildren.forEach(child => {
promises.push(this.serviceA.getSubscribers(child.id).subscribe( (subs: ISubscriber[]) => {
subs.forEach(s => {
subscribers.push(s);
});
}));
});
this.selectedSubscribers.forEach(sub => {
promises.push(this.serviceB.getSubscriber(sub.subscriberId).subscribe( (sub: ISubscriber) => {
subscribers.push(sub);
}));
});
// subscribers is always empty when this call is made
// since above code hasn't finished executing
Promise.all(promises).then( a => {
this.serviceC.processSubscribers(this.id, subscribers).subscribe( id => {
this.toastr.success('Success!');
});
});
}
解决方案
这行代码的结果是订阅而不是承诺
this.serviceA.getSubscribers(child.id).subscribe( (subs: ISubscriber[]) => {
subs.forEach(s => {
subscribers.push(s);
})
这意味着您的promise
数组不包含承诺,这就是为什么promise.all
不起作用
你可以这样做
promises.push(this.serviceB.getSubscriber(sub.subscriberId).toPromise())
或者
promises.push(this.serviceB.getSubscriber(sub.subscriberId).toPromise().then(x => ... ))
推荐阅读
- rust - 使用柴油和杜松插入值时出现奇怪的错误
- html - 垂直到水平打开关闭动画
- html - 如何使光标上的文本通过悬停显示图像
- mongodb - 如何按索引对嵌套的 mongodb 数组进行查询?
- visual-studio-2019 - Clickonce 使用 .NET 5 运行时发布 .NET 5 应用程序
- python - MongoDB 索引创建
- c++ - Gstreamer 切换视频并从上一个视频的时间戳播放新的视频
- python - 如何将数据框中的一列分成多列?[蟒蛇,熊猫]
- sql - 获取平均值、最大值、最小值、最后附加值和时间
- gsm - 是否可以解码 A3 或 A8 算法?