使用此代码,我可以正确添加到'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);
将记录一个空集。
我理解这是因为在for-of循环之外调用console.log之后发生了异步调用。
我的问题是,一旦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
)
正确的解决方案取决于您的需求。