新規投稿
フォローする

非同期リクエストでのデータの取得について

お世話になっております。
別アプリからのレコードの取得についての質問です。

100件以上のレコードを取得する際、非同期での処理は可能でしょうか。
Kintoneでは、レコードは1度に100件までしか取得出来ないと思います。
その為、ループで100件ずつ、全てのレコードが取得できるまでデータ取得処理を
繰り返そうと考えております。
この様なデータ取得処理は、非同期リクエストでも可能でしょうか。
もし可能でしたら、その方法についてご教授頂きたいと思います。
宜しくお願い致します。

0

8件のコメント

Avatar
落合 雄一

higuchi様
cstapの落合です。

あくまで一例ですが、こんな感じで取得できます。

(function() {
    "use strict";

    // レコード一覧画面
    kintone.events.on('app.record.index.show', function(event) {
        var manager = new KintoneRecordManager;
        manager.appId = 111; // 別アプリのID
        manager.getRecords(function(records) {
            // レコード取得後の処理
        });
    });

})();

/**
* Kintoneと通信を行うクラス
*/
KintoneRecordManager = (function() {
    KintoneRecordManager.prototype.query = '';

    KintoneRecordManager.prototype.records = [];

    KintoneRecordManager.prototype.appId = null;

    KintoneRecordManager.prototype.query = '';

    KintoneRecordManager.prototype.limit = 100;

    KintoneRecordManager.prototype.offset = 0;

    function KintoneRecordManager() {
        this.appId = kintone.app.getId();
    }

    // すべてのレコード取得する
    KintoneRecordManager.prototype.getRecords = function(callback) {
        kintone.api('/k/v1/records', 'GET', {
            app: this.appId,
            query: this.query + (' limit ' + this.limit + ' offset ' + this.offset)
        }, (function(_this) {
            return function(res) {
                var len;
                Array.prototype.push.apply(_this.records, res.records);
                len = res.records.length;
                _this.offset += len;
                if (len < _this.limit) {
                    _this.ready = true;
                    if (callback !== null) {
                        callback(_this.records);
                    }
                } else {
                    _this.getRecords(callback);
                }
            };
        })(this));
    };

    return KintoneRecordManager;
})();

以上、参考になりますでしょうか?

1
Avatar
s.higuchi

落合様
迅速なご回答ありがとうございます。
頂いたソースを参考に試してみようと思います。
ありがとうございました。

0
Avatar
s.higuchi

落合様
先ほどはご回答ありがとうございました。
早速頂いたソースを参考に非同期処理でのデータ取得を行ってみました。
質問なのですが、非同期で取得したレコードは、
manager.getRecords(function(records) {
// レコード取得後の処理
});
の外では使う事は出来ないのでしょうか。
取得レコードをグローバル配列に入れて、この関数の外で使用したいと
思ったのですが、出来ませんでした。
もし可能でしたら、やり方をご教授いただけたらと思います。
宜しくお願い致します。

0
Avatar
落合 雄一

higuchi様
データをグローバルに置きたいというのは、利用イメージがあまりできないのですが、どういう使い方をしたいのでしょうか?

1
Avatar
s.higuchi

落合様
今回は、複数のアプリからデータを取得し、それらを集計して
一覧(カスタマイズビュー)に表示させたいと考えております。
取得先のデータが大量ですと、取得に時間がかかってしまう為、
非同期でデータを取得しようとしています。
非同期ですと、上記の様にデータの取得、集計等は不可能でしょうか。

0
Avatar
カキ氷

manager.getRecords(function(records) {
// レコード取得後の処理
});
の外では使う事は出来ないのでしょうか。
取得レコードをグローバル配列に入れて、この関数の外で使用したいと思ったのですが、出来ませんでした。

コールバック内なのでおっしゃるとおりグローバル変数用意してやるといけます。
グローバル変数の宣言を"use strict";の次の行にしてみたらどうでしょう?

1
Avatar
落合 雄一

higuchi様

めっちゃ適当ですが、こんな感じでどうでしょう?
それぞれのアプリに対するリクエストが非同期で処理される感じです。
getRecordsは、KintoneRecordManagerをcallbackの引数にするように変更しています。
aggregateResultに結果が入っているので、そこを書き換えて集計処理を行ってみてください。

/**
 * @author Yuichi Ochiai <ochiai@cstap.com>
 */
(function() {
  "use strict";

  Array.prototype.next = function() {
    if (!((this.current + 1) in this)) return false;
    return this[++this.current];
  };
  Array.prototype.current = 0;

  var appIds = [2, 3, 4, 5];

  var aggregatedAppIds = [];

  var aggregateResult = [];

  var isAggregated = function () {
    return appIds.sort().toString() === aggregatedAppIds.sort().toString();
  };

  // レコード一覧画面
  kintone.events.on('app.record.index.show', function(event) {
    if (isAggregated()) {
      return event;
    }

    for (var i = 0, l = appIds.length; i < l; i++) {
      var appId = appIds[i];
      var manager = new KintoneRecordManager;
      manager.appId = appIds[i];
      manager.records = [];
      manager.getRecords(function(m) {
        if (!(aggregatedAppIds.indexOf(m.appId) >= 0)) {
          aggregatedAppIds.push(m.appId);
          aggregateResult.push({
            appId: m.appId,
            recordNum: m.records.length,
            records: m.records
          });
        }

        if (isAggregated()) {
          console.log(aggregateResult);
        }
      });
    }

    return event;
  });

})();

/**
* Kintoneと通信を行うクラス
*/
KintoneRecordManager = (function() {
  KintoneRecordManager.prototype.query = '';

  KintoneRecordManager.prototype.records = [];

  KintoneRecordManager.prototype.appId = null;

  KintoneRecordManager.prototype.query = '';

  KintoneRecordManager.prototype.limit = 100;

  KintoneRecordManager.prototype.offset = 0;

  function KintoneRecordManager() {
    this.appId = kintone.app.getId();
  }

  // すべてのレコード取得する
  KintoneRecordManager.prototype.getRecords = function(callback) {
    kintone.api('/k/v1/records', 'GET', {
      app: this.appId,
      query: this.query + (' limit ' + this.limit + ' offset ' + this.offset)
    }, (function(_this) {
      return function(res) {
        var len;
        Array.prototype.push.apply(_this.records, res.records);
        len = res.records.length;
        _this.offset += len;
        if (len < _this.limit) {
          _this.ready = true;
          if (callback !== null) {
            callback(_this);
          }
        } else {
          _this.getRecords(callback);
        }
      };
    })(this));
  };

  return KintoneRecordManager;
})();

以上、参考になりますでしょうか?

1
Avatar
s.higuchi

カキ氷様、落合様
ご回答本当にありがとうございます。
頂いたご回答を元に、非同期での処理を考えてみようと思います。
大変参考になりました。
ありがとうございました。

樋口

0
サインインしてコメントを残してください。