Короче говоря: я пытаюсь рекурсивно получить разбитые на страницы данные из вызова 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
не работает?