Использование Set после заполнения его асинхронными обратными вызовами; цикл for-of не принимает .entries () в качестве массива - PullRequest
0 голосов
/ 17 сентября 2018

Я сталкиваюсь с проблемами всякий раз, когда пытаюсь использовать набор, который я заполнил асинхронно:

    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        
      }
    );

Если я утешаю этот журнал, возвращается объект со свойством размера 98, а такжемассив 'Entities', который имеет каждое значение набора, к которому я пытаюсь получить доступ ...

Однако при попытке получить доступ к свойству размера напрямую возвращается размер набора 0 ...

Кроме того, значение Set.entries () НЕ принимается в цикле for в качестве массива, даже при использовании Array.from () ...

    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, предполагают, что это должно работать ... но это не так.

Где / как я пропускаю доступ к свойствам этого набора ???

1 Ответ

0 голосов
/ 17 сентября 2018

Использование 'forkJoin' вместо 'слияния' решило проблему:

    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]
        }
      }
    );

'merge' требовал, чтобы я подписывался на каждую Observable, которую он слил вместе, отдельно. Это означает, что обратный вызов завершения первоначальной подписки сработал до того, как набор был заполнен.

Поскольку «forkJoin» работает с данными ответа напрямую, набор теперь правильно заполняется и может быть повторен с помощью цикла «for-of».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...