我正在使用Nodejs库与Jira交谈,称为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是真的。然后我可以从承诺中组织我的所有回报并完成它。
我试图弄清楚如何用Ramda获取页面上的所有数据,我感觉有可能我似乎无法理清它的方法。
有帮助吗?这可能使用Ramda吗?
这是我的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的许多交互使用这个模型,我试图避免每次打电话时写这种循环。
今天我不得不做类似的事情,重复调用Gitlab API,直到我检索到项目的整个文件夹/文件结构。我在.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个文件和文件夹。一次调用10个,我们进行三次提取,当第三个完成时,我们用21个项目的列表解析返回的Promise。
这种递归方法肯定比上面的版本更有用。除了参数默认之外没有任何赋值,并且在此过程中没有任何变异。
我认为根据您的需求调整它应该相对容易。