首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在用异步回调填充集合之后使用它;for-of循环不接受.entries()作为数组

在用异步回调填充集合之后使用它;for-of循环不接受.entries()作为数组
EN

Stack Overflow用户
提问于 2018-09-17 11:34:33
回答 1查看 23关注 0票数 0

每当我尝试使用异步填充的集合时,我都会遇到问题:

代码语言:javascript
运行
复制
    const MaterialType_Requests_FromESI$ = SDE_REACTIONDATA.map(data => this.ESI.ReturnsType_AtId(data.materialTypeID));

    let MaterialCollectionSet: Set<string> = new Set<string>();

    let MergedMaterialTypes$ = merge(MaterialType_Requests_FromESI$);

    MergedMaterialTypes$.subscribe(
      MaterialType$ => MaterialType$.subscribe(MaterialType => MaterialCollectionSet.add(MaterialType.name)),      
      null,
      () => {
        console.log(MaterialCollectionSet);      // Outputs Set object, with a 'size' of 98
        console.log(MaterialCollectionSet.size); // Outputs 'size' as 0        
      }
    );

如果我对这个集合执行console.log操作,将返回一个size属性为98的对象,以及一个'Entities‘数组,其中包含我试图访问的集合的每个值……

但是,尝试直接访问size属性会返回Set size为0...

此外,即使在使用Array.from()时,在for-of循环中也不会将Set.entries()值作为数组接受。

代码语言:javascript
运行
复制
    const MaterialType_Requests_FromESI$ = SDE_REACTIONDATA.map(data => this.ESI.ReturnsType_AtId(data.materialTypeID));

    let MaterialCollectionSet: Set<string> = new Set<string>();

    let MergedMaterialTypes$ = merge(MaterialType_Requests_FromESI$);

    MergedMaterialTypes$.subscribe(
      MaterialType$ => MaterialType$.subscribe(MaterialType => MaterialCollectionSet.add(MaterialType.name)),      
      null,
      () => {

        // This loop runs zero times, despite Entries having 98 values
        for(let entry of Array.from(MaterialCollectionSet.entries())) {
          console.log(entry)
        }

        // console.log(MaterialCollectionSet);      // Outputs Set object, with a 'size' of 98
        // console.log(MaterialCollectionSet.size); // Outputs 'size' as 0        
      }
    );

this这样的帖子,说要使用for-of循环,建议这应该是可行的……但事实并非如此。

我在哪里/如何错过访问此集属性?

EN

回答 1

Stack Overflow用户

发布于 2018-09-17 14:31:04

使用'forkJoin‘代替'merge',解决了这个问题:

代码语言:javascript
运行
复制
    let MaterialType_Requests_FromESI$ = SDE_REACTIONDATA.map(data => this.ESI.ReturnsType_AtId(data.materialTypeID));

    let MaterialCollectionSet: Set<string> = new Set<string>();

    forkJoin(MaterialType_Requests_FromESI$).subscribe(
      MaterialTypes => MaterialTypes.forEach(Type => MaterialCollectionSet.add(Type.name)),
      null,
      () => {
        for(let entry of Array.from(MaterialCollectionSet.entries())){
          console.log(entry[0]) // [0] selects the key of the Set, which is the same as the value of the Set at [1]
        }
      }
    );

“合并”要求我单独订阅它合并在一起的每个观察点。这意味着初始订阅的完成回调是在集合被填充之前触发的。

因为'forkJoin‘直接处理响应数据,所以现在可以正确地填充集合,并且可以使用'for-of’循环迭代。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52360417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档