promise内のループに関して

いつもお世話になっております。

Promiseの中にループ処理を入れたいのですが、よくわかっておらずうまくできません。

ご教授をお願いします。

//種類の登録
  function setkind(){
    var kind = document.getElementById(‘target-date’).value;
    var updateList = [];
    var searchList = [];
    var updateList2 = [];
    var limit = 500;
    var tmpRecords = tmpRecords || [];
    var hdDataList = [];
    
    //Aアプリから更新対象のレコード番号を取得
    return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, param).then((resp) => {
      if(resp.records.length == 0){
          swal(‘データがありません’, ‘’, ‘success’);
      }else{
          for (var i=0; i < resp.records.length; i++) {
            var listVal = {
                ‘id’:resp.records[i][‘レコード番号’].value,
                ‘record’:{
                  ‘種類’:{value:kind}
                }
            };
            updateList.push(listVal); //Aアプリ更新用
            searchList.push(resp.records[i][‘登録番号’].value); //Bアプリ検索用
          }
      }
    }).then((resp2) => {
        //Bアプリから更新対象のレコードを取得
        if(searchList.length > 0){
          var myPromise = Promise.resolve();
            for (var i=0; i < searchList.length; i++) {
              var param2 = {
                app: Bアプリ,
                query: ‘登録番号 = "’ + searchList[i] + ‘"’
                };
              myPromise = myPromise.then(task1.bind(this, param2)); //←★ここがわからない
            }
                
    }).then((resp3) => {
        //Bアプリへ種類の更新
        if(searchList.length > 0){
            var param3 = {
                app: Bアプリ,
                records: updateList2
              };
              console.log(param3);
            return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, param3).then((resp3) => {
               console.log(“BアプリUp”);
                
            }, function (resp3) {
              alert(“種類登録エラー”);
              console.error(‘種類登録エラー’, param3, resp3);
            });
        }
    }).then((resp4) => {
        //Aアプリへの更新
        var param4 = {
            app: Aアプリ,
            records: updateList
          };
        return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, param4).then((resp4) => {
          console.log(“AアプリUp”);
        }, function (resp1) {
          
        });
    });
    
    // ループで実行する処理
    function task1(param2){
      return new Promise(function(resolve, reject) {
        setTimeout(function(){
            return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, param2).then((resp2) => {
                  var listVal2 = {
                      ‘id’:resp2.records[0][‘レコード番号’].value,
                      ‘record’:{
                        ‘種類’:{value:kind}
                      }
                  };
                  updateList2.push(listVal2);
                }, function (resp2){
                
                  });
            resolve();
         }, 1000);
      });
    }
  }

Promiseの中に、というよりPromiseが必要なAPI処理をループで実行させると完了する前に次のループへ移ってしまうので、async/awaitで処理が終わるのを待つようにさせれば問題ないです(この処理だとループ1回ごとにsetTimeoutの1秒を待つのでどうなのかとは思いますが。本当にスマートなのはPromise.allを使う形だと思います)。

    }).then((resp2) => {
        //Bアプリから更新対象のレコードを取得
        if(searchList.length > 0){
          var myPromise = Promise.resolve();
            for (var i=0; i < searchList.length; i++) {
              var param2 = {
                app: Bアプリ,
                query: '登録番号 = "' + searchList[i] + '"'
                };
              myPromise = myPromise.then(task1.bind(this, param2)); //←★ここがわからない
            }

}).then(async (resp2) => {
    if (searchList.length > 0) {
        for (var i=0; i < searchList.length; i++) {
            var param2 = {
                app: Bアプリ,
                query: '登録番号 = "' + searchList[i] + '"'
            };

            await task1(param2);
        };

mls-hashimoto様

ご返信ありがとうございます。

なるほどです!async/await使ったことなかったです。便利ですね!

もう一度コードを整理してやってみます。

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

mls-hashimoto様

お世話になります。async/awaitを使用する環境づくりとして、

kintone-rest-api-clientのURLをアップロードする以外に何かありますでしょうか?

教えていただければ嬉しいです。

よろしくお願いします。

matsu さま

async/awaitの使いどころということでしょうか?基本的にPromiseを返している関数に対して使えるので、then()をasync/awaitに置き換えることでプログラム本来の「上から下に向かって順に実行させる」ことができるようにすることができます。ただしthen()の完全な上位互換というわけではなく、使い分けなければならない場面はあります(使い分けについては使っていけば理解できるようになると思います)。

kintoneで使うのであればこちらの記事が参考になるでしょう。

一般的なPromiseとasync/awaitの理解はこちらの記事が参考になるかと思います。async/awaitは基本的にPromiseを理解した上で使う必要があります。

mls-hashimoto

async/awaitのURLのご共有ありがとうございます。今勉強させていただいています。

 

伝え方が悪く申し訳ありません。

kintoneで使用しようとしたら、見よう見真似で処理を入れてみてもJSEditにてsyntaxエラーが表示されてしまいます。

そこでkintone-rest-api-clientのURLを入れてみましたが変わらずです。

まず利用する前に環境構築をしないといけないのかな、と思われますが、うまくいかず…

初心者ですみません。

 

 

 

matsu さま

JSEdit for kintoneプラグインですね。確かJSEdit for kintoneはasync functionを解釈できないという認識をしています(async/await自体が比較的新しい構文で、少し前まではIE等のブラウザの影響から環境によっては非推奨でしたが、今はIEが起動できないので基本的にどのブラウザでも動作します)。

発生しているものもエラーではなく警告文のはずですが、こちらについてはエディタの構文チェックが古いとしか言えません。気にされるのでしたら別のテキストエディタ(VSCode等)を導入されるのが良いかと思います。

mls-hashimoto

なるほどです!構文チェックが古いということがあるんですね!

ずっとなんで構文エラーが発生するのだろう、と悩んでいました。

本当にありがとうございました、やってみます!!

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。