Many GitHub API endpoints are paginated. The octokit.paginate
method can be used to get each page of the results.
module.exports = (app) => {
app.on("issues.opened", (context) => {
context.octokit.paginate(
context.octokit.issues.list,
context.repo(),
(response) => {
response.data.issues.forEach((issue) => {
context.log.info("Issue: %s", issue.title);
});
}
);
});
};
The return value of the octokit.paginate
callback will be used to accumulate results.
module.exports = (app) => {
app.on("issues.opened", async (context) => {
const allIssues = await context.octokit.paginate(
context.octokit.issues.list,
context.repo(),
(response) => response.data
);
console.log(allIssues);
});
};
Sometimes it is desirable to stop fetching pages after a certain condition has been satisfied. A second argument, done
, is provided to the callback and can be used to stop pagination. After done
is invoked, no additional pages will be fetched, but you still need to return the mapped value for the current page request.
module.exports = (app) => {
app.on("issues.opened", (context) => {
context.octokit.paginate(
context.octokit.issues.list,
context.repo(),
(res, done) => {
for (const issue of res.data) {
if (issue.body.includes("something")) {
console.log("found it:", issue);
done();
break;
}
}
}
);
});
};
If your runtime environment supports async iterators (such as Node 10+), you can iterate through each response
module.exports = (app) => {
app.on("issues.opened", async (context) => {
for await (const response of octokit.paginate.iterator(
context.octokit.issues.list,
context.repo()
)) {
for (const issue of response.data) {
if (issue.body.includes("something")) {
return console.log("found it:", issue);
}
}
}
});
};
Found a mistake or want to help improve this documentation? Suggest changes on GitHub