新規投稿
フォローする

再帰関数内での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){
        });
      });
    });
0

2件のコメント

Avatar
cybozu Development team
コードを拝見するに
 
          // レコード数分、取得処理を繰り返す
          getRecords(dataLists, appRecords, i, targetAppId);
 
ここをreturnをつけて
 
          // レコード数分、取得処理を繰り返す
          return getRecords(dataLists, appRecords, i, targetAppId);
 
とすることでPromiseがreturnされて再帰処理でも待ちそうな気がしますがいかがでしょう
0
Avatar
Kakiuchi

村濱様

 

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

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

 

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

 

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

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