Rxjs рекурсия с обратным вызовом - PullRequest
2 голосов
/ 22 декабря 2019

Короче говоря: я пытаюсь рекурсивно получить разбитые на страницы данные из вызова API, который я завернул в bindCallback, но рекурсия не работает.

Подробности:

Я вызываю функцию request в Pinterest Javascript SDK для захвата булавок с доски. Сам вызов API принимает как параметры, так и обратный вызов. Ответ, возвращаемый на этот вызов, содержит (разбитые на страницы) данные, а также логическое значение hasNext и рекурсивный вызов next() для захвата следующей пагинации данных. API Pinterest сообщает, что next() "будет рекурсивно переходить к тому же самому обратному вызову."

const Pinterest = {
    pins: (boardName, callback) => {
        var params = {
            fields: "id, note, link, image",
            limit: 100
        };
        var boardId = `test`;
        PDK.request(`${boardId}/pins/`, params, callback);
    }
};

type BoardPinsResponse = {
    data: Array<Pin>;
    hasNext?: boolean;
    page?: {
        cursor: string;
        next: () => BoardPinsResponse;
    };
};

Я использую эпосы Redux в своем приложении React для обработки этих вызовов, поэтому все в Rxjs Observables. Я решил получить первую часть данных, просто заключив вызов API в bindCallback RxJS, чтобы вызвать обратный вызов.

const pinsObservable = bindCallback(Pinterest.pins);

const fetchPinsEpic = (action$, _) =>
    action$.pipe(
        filter(isActionOf(fetchPinsAsync.request)),
        mergeMap(action =>
            pinsObservable(action.payload).pipe(
                expand(response => response.hasNext ? of(response.page!.next()) : empty()),

                // ^ this call doesn't seem to be working

                map(response => {
                    return fetchPinsAsync.success({
                        month: action.payload,
                        pins: response.data
                    });
                }),
                catchError((message: string) =>
                    of(fetchPinsAsync.failure(message))
                )
            )
        )
    );

Теперь проблема заключается в том, как вызвать рекурсивную ссылку, возвращаемую API. Вызов его только внутри функции map ничего не делает, так как я считаю, что bindCallback допускает только один вызов. Я предположил бы, что мог бы использовать оператор expand, чтобы рекурсивно заставить это произойти, пока hasNext не вернет false, но я не могу получить вызов для проталкивания данных. Я вижу, как он однажды переходит в правильную ветку, чтобы получить больше данных, но потом никогда не увидит, что произойдет рекурсия.

Что-то нужно добавить после expand, чтобы перехватить данные? Помещение expand внутрь bindCallback не работает?

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