异步调用完成后如何访问Set

问题描述 投票:1回答:1

使用此代码,我可以正确添加到'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?

angular typescript asynchronous callback
1个回答
0
投票

我们可以使用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
)

正确的解决方案取决于您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.