rxjs debounce для каждого типа запроса - PullRequest
0 голосов
/ 22 апреля 2019

Попытка буферизовать данные таким образом, чтобы

  • Входные данные обрабатывались для каждого входа name.Если a и b - это два разных файловых содержимого разных файлов, отправляемых рядом друг с другом, то их запрос должен обрабатываться индивидуально.
  • После того, как промежуток времени отладки завершается, он должен последовательно отправляться на сервер, так чтопротиводавление может быть принято во внимание.
  • Значение отклонения должно быть переопределено последним излучением того же типа.

при условии, что отклонение для 5 кадров

INPUTS IN TIME        a-a---a-b-----b--------b-b-----a-----a--b--a-----
send data to server   -----------a--b-----b----------b-----a-------b---

let a: { name: string, value: string } = { name: 'a', value: 'a' }//input
let b: { name: string, value: string } = { name: 'b', value: 'b' }//input

Проверенный код

export interface SaveEntry {
    resource: string;
    provider: MonoTypeOperatorFunction<any>;
}

const bufferSave = new BehaviorSubject<SaveEntry[]>([]);
export const saveEpic
    = (action$, state$, {  }) =>
        merge(action$.pipe(ofType(CONTENT_CHANGE)).pipe(map(x => x)), action$.pipe(ofType(SAVE)).pipe(map(x => x)))
           map(input => {
                    bufferSave.next([...bufferSave.value, {
                        resource: input.action.payload.name, provider: debounce(() => {
                            if (input.delayTime) {
                                console.log('---debounce to delay', input.delayTime);
                                return timer(input.delayTime);
                            } else {
                                console.log('---debounce not to delay');
                                return timer(0);
                            }
                        }),
                    }],
                    );
                    return bufferSave
                        .pipe(
                            concatMap(entries => entries.map(({ provider }) => forkJoin(from(provider))),
                            ),
                            tap(result => console.log('----result', result)),
                            map(response => ({ type: SAVE_RESPONSE, ...response })),
                        );  

                    });
...