Как мне вернуть весь постраничный набор из Jira API с помощью Ramda? - PullRequest
0 голосов
/ 23 апреля 2019

Я использую библиотеку Nodejs для общения с Джирой, которая называется jira-connector.Я могу получить все доски в моем экземпляре jira, вызвав

jira.board.getAllBoards({ type: "scrum"})
  .then(boards => { ...not important stuff... }

, возвращаемый набор выглядит примерно так:

{ 
  maxResults: 50,
  startAt: 0,
  isLast: false,
  values:
   [ { id: ... } ]
}

, тогда как isLast === false Я продолжаю звонить так:

jira.board.getAllBoards({ type: "scrum", startAt: XXX })

, пока isLast не станет истинным.тогда я могу организовать все свои возвращения из обещаний и покончить с этим.

Я пытаюсь выяснить, как я могу получить все данные на страницах с Рамдой, у меня есть ощущение, что это возможно, я простоне могу разобраться, как это.

Любая помощь?Возможно ли это с помощью Рамды?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Мне пришлось сделать что-то подобное сегодня, неоднократно вызывая API Gitlab, пока я не получил всю структуру папок / файлов проекта. Я сделал это с помощью рекурсивного вызова внутри .then, и, похоже, все работает нормально. Я не пытался преобразовать код для обработки вашего дела.

Вот что я написал, если поможет:

const getAll = (project, perPage = 10, page = 1, res = []) =>
  fetch(`https://gitlab.com/api/v4/projects/${encodeURIComponent(project)}/repository/tree?recursive=true&per_page=${perPage}&page=${page}`)
    .then(resp => resp.json())
    .then(xs => xs.length < perPage
            ? res.concat(xs)
            : getAll(project, perPage, page + 1, res.concat(xs))
         )
 
getAll('gitlab-examples/nodejs')
  .then(console.log)
  .catch(console.warn)

Техника довольно проста: наша функция принимает любые параметры, необходимые для возможности извлечения конкретной страницы, и дополнительную, чтобы хранить результаты, по умолчанию превращая ее в пустой массив. Мы делаем асинхронный вызов для извлечения страницы, и в then мы используем результат, чтобы увидеть, нужно ли нам сделать еще один вызов. Если мы это сделаем, мы снова вызываем функцию, передавая другие необходимые параметры, увеличенный номер страницы и объединение текущих результатов и только что полученных. Если нам не нужно делать еще один вызов, мы просто возвращаем этот объединенный список.

Здесь хранилище содержит 21 файл и папку. Вызывая по десять штук за раз, мы делаем три выборки, и когда третий завершается, мы решаем наше возвращенное обещание с этим списком из 21 элемента.

Этот рекурсивный метод определенно чувствует себя более функциональным, чем ваши версии выше. За исключением параметра по умолчанию, присваивания нет, и по пути ничего не мутировало.

Я думаю, что это должно быть относительно легко приспособить к вашим потребностям.

0 голосов
/ 24 апреля 2019

Вот моя Rx попытка сделать это лучше:

const pagedCalls = new Subject();

pagedCalls.subscribe(value => {
    jira.board.getAllBoards({ type:"scrum", startAt: value })
        .then(boards => {
            console.log('calling: ' + value);
            allBoards.push(boards.values);
            if (boards.isLast) {
                pagedCalls.complete()
            } else {
                pagedCalls.next(boards.startAt + 50);
            }

        });
})
pagedCalls.next(0);

Кажется довольно ужасно. Вот простейшее решение, которое у меня есть с циклом do / while:

let returnResult = [];
let result;
let startAt = -50;

do {

  result = await jira.board.getAllBoards( { type: "scrum", startAt: startAt += 50 })
  returnResult.push(result.values); // there's an array of results under the values prop. 

} while (!result.isLast)  

Многие из взаимодействий с Jira используют эту модель, и я стараюсь не писать такой цикл каждый раз, когда я звоню.

...