新規投稿
フォローする

for of文における同期処理について

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

表題の内容を教えてください。

var records = [];

return kintoneUtility.rest.getAllRecordsByQuery(param1).then((allRecords) => {
  for (var rec of allRecords['records']) {
     tableValueFetch(rec['コード'].value, rec['成績表'].value).then((param) => {
     records.push(param, appId);
  });
  }
  return records
}).then((records) => { ・・・

上記のコードで、for of文で処理した結果をrecordsとして返したいのですが、for of文の処理が実施されず、recordsが空で返されてしまいます。

具体的な訂正コードを教えて頂ければ、非常に助かります。

よろしくお願い申し上げます。

0

5件のコメント

Avatar
江田篤史

Yasuhiro K様

お世話になっております.

tableValueFetch()が非同期処理ということでしょうか?

複数の非同期処理を待機する場合は,Promise.all()を利用するとよいです.
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

var records = [];
return kintoneUtility.rest.getAllRecordsByQuery(param1).then((allRecords) => {
  return Promise.all(allRecords['records'].map((rec) => {
    return tableValueFetch(rec['コード'].value, rec['成績表'].value);
  }));
}).then((params) => {
  params.forEach((param) => {
    records.push(param, appId);
  });
});
江田篤史により編集されました
0
Avatar
Yasuhiro K

江田様

 

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

江田様の書かれた内容をいつも確認させて頂き、勉強させていただいております。

ありがとうございます。

お陰さまで非同期処理の問題は解消されました。

ただ、まだ問題がございます。

違うアプリからレコードをGETして、参照元のアプリのテーブルにそのデータを追加したいと考えています。

下記のコードを実行するとBad Requestが返ってきます。

お手数ですが、ご確認頂き、間違いをご指摘頂けますでしょうか?

よろしくお願い申し上げます。

 

//実行タイミングはレコード詳細画面を開いた時
kintone.events.on("app.record.detail.show", (event) => {

 var appId = 100

  var param1 = {
             app: appId,
             field: ['コード', '成績表']
        };

        var records = [];
        return kintoneUtility.rest.getAllRecordsByQuery(param1).then((allRecords) => {
             return Promise.all(allRecords['records'].map((rec) => {
             return tableValueFetch(rec['YLコード'].value, rec['成績表'].value);
             }));
        }).then((params) => {
             params.forEach((param) => {
                  records.push(param, appId);
             });
        }).then(() => {

            var param2 = {
                  app: appId,
                  records: records
            }


            return kintoneUtility.rest.putAllRecords(param2).then((resp) => {
                   console.log(JSON.stringify(resp, null, ' '));
            }).catch((error) => {
                  console.log(error.message);
            });
       });
    }
});

//コードから成績表アプリの該当レコードを取得
function tableValueFetch(aCode, tableRecords) {
     var refAppId = 459;
     var params = {
           app: refAppId,
           query: 'コード="' + ylCode + '"',
           //レスポンスに含めるフィールド指定
            fields: ["$id", "対象年月", "組織名", "番号", "顧客軒数",
           "本数1", "本数2", "合計金額"]
      };

      //引用元のアプリからレコードGET
      return kintoneUtility.rest.getAllRecordsByQuery(params).then((resp) => {
           //変数に「r」にレスポンスで返ってきたものを代入、
           //レスポンスがなくなるまで繰り返す
           for (var rec of resp['records']) {
                var tableRecord = {
                value: {
                "対象年月": {
                            value: "<div><a href=\"/k/" + refAppId + "/show#record="
                                       + rec['$id'].value + "\">"
                                       + rec['対象年月'].value
                                       + "</a></div>"
                },
               "成績表_組織名": {
                            value: rec['組織名'].value
               },
              "成績表_番号": {
                            value: rec['地区番号'].value
               },
              "顧客軒数": {
                            value: rec['顧客軒数'].value
              },
              "本数1": {
                          value: rec['本数1'].value
              },
             "本数"2: {
                          value: rec['本数2'].value
             },
             "売上金額": {
                          value: rec['合計金額'].value
             }
             }
         };
         tableRecords.push(tableRecord);
     }

     var record = {
        '成績表': {
              value: tableRecords
         }
    };

    var key = {
           field: 'コード',
           value: aCode
    };

    var records = {
           updateKey: key,
           record: record
    }

     return records;
   });

 }

0
Avatar
Yasuhiro K

江田さま

汚いコードで申し訳ございません。

コメントは間違えているかもしれませんので、無視して頂ければと思います。

下記は間違えています。

×

      "成績表_番号": {
                value: rec['地区番号'].value
       },

      "成績表_番号": {
                value: rec['地区番号'].value
       },

フィールドコードは企業情報もございますので、訂正しましたので、訂正ミスがありかもしれません。

重ね重ね申し訳ございません。

 

0
Avatar
Yasuhiro K

×     

  var params = {
           app: refAppId,
           query: 'コード="' + ylCode + '"',
           //レスポンスに含めるフィールド指定
            fields: ["$id", "対象年月", "組織名", "番号", "顧客軒数",
           "本数1", "本数2", "合計金額"]
      };

     var params = {
           app: refAppId,
           query: 'コード="' + aCode + '"',
           //レスポンスに含めるフィールド指定
            fields: ["$id", "対象年月", "組織名", "番号", "顧客軒数",
           "本数1", "本数2", "合計金額"]
      };

 

0
Avatar
Yasuhiro K

お世話になります。

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

自己解決いたしました。

 

×

           records.push(param, appId);

           records.push(param);

 

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