使用此代码,我可以正确地添加到“ MaterialCollectionSet”中
let MaterialCollectionSet: Set<string> = new Set();
for(let data of SDE_REACTIONDATA) {
this.ESI.ReturnsType_AtId(data.materialTypeID).subscribe((MaterialData) => {
MaterialCollectionSet.add(MaterialData.name);
});
但是,尝试运行此代码
let MaterialCollectionSet: Set<string> = new Set();
for(let data of SDE_REACTIONDATA) {
this.ESI.ReturnsType_AtId(data.materialTypeID).subscribe((MaterialData) => {
MaterialCollectionSet.add(MaterialData.name);
});
console.log(MaterialCollectionSet);
将记录一个空的Set。
我了解这是由于console.log在for-of循环之外被调用之后发生的异步调用。
我的问题是,在for-of循环完成填充后如何实际使用Set?
我们可以forkJoin
用来等待所有请求
const requests$ = SDE_REACTIONDATA.map(data => this.ESI.ReturnsType_AtId(data.materialTypeID));
let MaterialCollectionSet: Set<string> = new Set();
forkJoin(requests$).subscribe(responses => {
// Now you can access the `responses`;
MaterialCollectionSet.add(responses.map(MaterialData => MaterialData.name));
})
或如@JB Nizet建议的那样:
const requests$ = SDE_REACTIONDATA.map(data => this.ESI.ReturnsType_AtId(data.materialTypeID));
let MaterialCollectionSet: Set<string> = new Set();
merge(requests$).subscribe(
MaterialData => MaterialCollectionSet.add(MaterialData.name),
null, // error handler
() => console.log(MaterialCollectionSet) // complete
)
严格的解决方案取决于您需要什么。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句