RxJs 6: Управление итерацией массива и задержкой - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужна помощь по управлению задержкой на итерации массива.

Относительно моих https://jsfiddle.net/mlefree/vrL813j2/93/, двух вопросов:

  1. Как добавить задержку на каждое итерационное действие?
  2. Как уменьшить все вычисленные значения итерации?

`` `

...

const arrayAsObservable = of(null).pipe(
        delay(500),
        switchMap(_ => getObjectWithArrayInPromise()),
        map(val => {
            log('array', val);
            return (val.myArray);
        }),
        switchMap(val => from(val))
    );

const eachElementAsObservable = arrayAsObservable.pipe(
                delay(500), // Not working : we want to wait 500ms more for each value
        map(val => {
            log('value', val);
            return val ;
        }),
        switchMap(val => getNewValueInPromise(val)),
        map(val => {
        // Not working : why not all new values ?
            log('value after computing (KO)', val);
            return (val);
        })
     );

const summarizeAsObservable = eachElementAsObservable.pipe(
// Not working : we want to sum all new values
        map(val => { 
            log('value before reduce (KO)', val);
            return val ;
        }),
        reduce((a,b) => a + b)
);

summarizeAsObservable.subscribe(msg => {
    log('We did a total of (KO)', msg);
});

`` `

1 Ответ

0 голосов
/ 01 ноября 2018

В целом код слишком сложный, корень проблемы вашего кода - несколько строк.

Причина, по которой вы получаете только одно значение после вычисления (KO), заключается в том, что вы использовали switchMap, который отменит подписку на внутреннюю наблюдаемую часть после исходной эмиссии, поэтому вы всегда получите последнее испущенное значение. Я также изменяю задержку на timer и mapTo испускаемое значение

 const eachElementAsObservable = arrayAsObservable.pipe(

  concatMap(value => timer(1500).pipe(mapTo(value))), // Not working : we want to wait 500ms for each value
  map(val => {
    log('value', val);
    return val;
  }),
  mergeMap(val => from(getNewValueInPromise(val))),
  map(val => {

    // Not working : why not all new values ?
    console.log('value after computing (KO)', val);
    return (val);
  })
);

это обновленная скрипка https://jsfiddle.net/fancheung/vrL813j2/109/ Код работает не полностью, потому что вы выдаваете ошибку путем отклонения в обещании, из-за которого наблюдаемое прекращает излучение, вам нужно поместить catchError где-то в потоке

...