BloomScheme Blog

株式会社ブルームスキーム公式ブログ

Backlogのプロジェクトの全課題を取得したい

f:id:BloomScheme:20190405200747p:plain
https://developer.nulab.com/ja/docs/backlog/api/2/get-issue-list/ のページ

Backlogのプロジェクトの全課題を取得したい

と思って簡単に実装をしてみたところ、問題が発生しました。 Backlogの課題はGET /api/v2/issues で取得できますが、瞬間的に多数のリクエストを投げるとエラーを返されてしまいます。 ですので、全課題を取得したいときはサーバーの負荷を上げすぎないように時間あたりのリクエスト数をへらす必要があります。

出来上がったコード

export const getIssues = async (params={}) => {
    if (issuesCache.length > 0) {
        return issuesCache
    }

    return new Promise(async (resolve, reject) => {
        let issues = []
        let offset = 0
        const count = 100

        const interval = 500

        const max = 100

        const intervalId = setInterval(async () => {
            const result = await key_request("GET", `issues`, {
                ...params,
                count,
                offset:offset*count
            })
            if ((!result.response.ok)||(result.length == 0)||(offset > max)) {
                clearInterval(intervalId)
                const result = reduceIssues(issues)
                issuesCache = result
                resolve(result)
                return
            }
            issues = [...issues, ...result]
            offset++
        }, interval)
    })
}

※key_requestはAPIキーを付与してfetchするメソッド

ざっくり解説

  • 単位時間あたりのリクエスト数を減らしたいので、setIntervalを使って一定間隔ごとにリクエストしている
    • 結果は issues 配列にとっておく
  • await すればまるっと結果が入るように、Promiseでラッピング。
    • リクエスト結果が!okだったら、最後に到達したということなのでresolveで結果を返す

という感じで、相手側サーバーの負荷をあまり挙げない形で全課題取得が実装できました。 ただ、このコードだと各サイクルで本当に取得が完了しているか?というチェックを全くしていないので、より厳密にやるならもっと別の形で実装する必要があると思います。