再帰関数内でのkintone.Promiseの実行

あるアプリAで取得したレコードの情報をキーに、アプリBのレコードを検索し、取得結果を加工したものをアプリCに登録するという処理を行いたいです。

 

 

アプリAには複数レコードが登録されています。

(文面上はアプリBとしますが、複数のアプリに検索処理を行いにいきます)

 

アプリBへの検索処理(以下コードのgetRecords)を再帰的に行い、必要なデータが揃った段階でbulkRequestでアプリCへデータ登録を行う想定です。

    

アプリBへの検索処理にてpromiseで処理を待機させたいのですが、アプリBの検索処理の途中で、アプリCへの登録処理が走り、1件しかレコードが登録されません。

 

promiseの記述の問題かとは思いますが、再帰処理にてpromiseを順番通り実行する方法がありましたら、ご教示ください。

 

【理想】

アプリAへの検索→アプリBへの検索をN回繰り返す→アプリCへの登録

 

【現状】

アプリAへの検索→アプリBへの検索(途中)→アプリCへの登録→アプリBへの検索

 

 

【コード】

  // アプリBへの検索処理

  function getRecords(dataLists, appRecords, i, targetAppId) {

 

    console.log(‘getRecords’);

      

    return new kintone.Promise(function(resolve, reject){

 

      kintoneRecord.getAllRecordsByQuery(requestParam).then(function(resp) {

 

            // 取得したレコードのデータを加工する

          }

        }

 

        // 次レコード分、カウントアップする

        i++;

 

        if (i < appRecords[0].length) {

          // レコード数分、取得処理を繰り返す

          getRecords(dataLists, appRecords, i, targetAppId);

        }

        resolve(dataLists);

      });

    });

    }

 

// アプリA内のレコードを取得した後に、アプリBの検索処理を実行

    return kintone.Promise.all([getAllData, getAppName]).then(function(results) {

      count = results[0].length;

      targetAppId = results[1];

      var i = 0;

 

      // return new kintone.Promise(function(resolve, reject) {

// アプリBへの検索処理

        getRecords(dataLists, results, i, targetAppId).then(function(allRecords){

          var j = 0;

 

          // アプリCへの登録処理

          postRecords(allRecords, j, targetAppId).then(function(postResults){

        });

      });

    });

コードを拝見するに

 

          // レコード数分、取得処理を繰り返す

          getRecords(dataLists, appRecords, i, targetAppId);

 

ここをreturnをつけて

 

          // レコード数分、取得処理を繰り返す

          return getRecords(dataLists, appRecords, i, targetAppId);

 

とすることでPromiseがreturnされて再帰処理でも待ちそうな気がしますがいかがでしょう

村濱様

 

ご回答いただき、ありがとうございます。

返信が遅れてしまい、申し訳ありません。

 

ご指摘の通り、returnを付与することで再帰的に処理を実行することができました。

 

ありがとうございました。