新規投稿
フォローする

非同期処理で得られた情報を引き継ぎたい

ボタンをクリック後、別アプリ➀、別アプリ➁、別アプリ➂の各アプリの情報を取得したいのですが、別アプリ➁、別アプリ➂では別アプリ➀で入手して得られた情報(register_ymd_from)をもとに別アプリ➁、別アプリ➂のレコードを取得したいのです。

しかし、非同期処理の為、register_ymd_fromがundefinedとして怒られます。

 いろいろ調べるとPromise もしくは async/awaitを借りて処理ができそうな感じなのですが、初心者の為、そもそも別アプリ➀→別アプリ➁→別アプリ➂での処理自体はアリなのでしょうか。

又、async/await を調べて、幾つか試したのですが

 kintone.events.on('app.record.create.show', async function(event){
await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {
又は、
kintone.api(await kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {
 
エラー1)Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules

エラー2)Uncaught SyntaxError: missing ) after argument list

いまいち、書き方や処理など理解しておらず頓挫しております。

ご指導いただければ助かります。

よろしくお願いいたします。

 

    kintone.events.on('app.record.create.show', function(event){

// 任意のスペースフィールドにボタンを設置
      const mySpaceFieldButton = document.createElement('button');
      mySpaceFieldButton.id = 'space_field_button';
      mySpaceFieldButton.innerText = 'レコードを入手';
//  mySpaceFieldButton.style.background = 'blue'; 
 
//ボタンをクリックしたときの動作
      mySpaceFieldButton.onclick = () => {

        var record = kintone.app.record.get().record;
        var register_id = record.key.value;
        var register_ymd = record.simeymd.value;
★      var register_ymd_from;
   

//納品先データ
        var body = {
            'app': 54,     //納品先データ 
            'query': '納品先CD = "' + register_id + '" order by 納品先CD asc ' + ' limit 500',
            'fields': ['納品先CD','納品先名称','担当者CD','担当者名','USANCE'],
            'totalCount': 'true'
        };

➀      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {

                処理

   }, (error) => {
    // // error
       console.log(error);
     }
  
        );  

  //入金明細データ
        var body = {
            'app': 27,     //入金明細データ 
            'query': 'tokcod = ' + register_id + ' and nyuymd >= "' + register_ymd + '" order by tokcod asc ' + ' limit 500',
            'fields': ['nyuymd','torihiki','nyukin','denno','biko'],
            'totalCount': 'true'
        };
      
➁       kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {

                処理

      }, (error) => {
      // // error
         console.log(error);
       }
     
        );  

      //入金請求データ
        var body = {
            'app': 20,     //入金請求データ 
            'query': 'tokcod = ' + register_id + 
                  ' and simeymd > "' + register_ymd +
                  '" and simeymd <= "' + register_ymd_from +
                  '" order by tokcod asc ' + ' limit 500',
            'fields': ['tokcod','tokname','zenkin','nyukin','zankin','uriage','tax','seikyu','simeymd'],
            'totalCount': 'true'
        };

➂      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body, (resp) => {

                処理

      }, (error) => {
      // // error
         console.log(error);
       }
     
      );  

    };
             
    kintone.app.record.getSpaceElement('space_field').appendChild(mySpaceFieldButton);
             
    return event;

  });

0

7件のコメント

Avatar
新屋 育男

マル 様

こんにちは。

プロミス難しいですよね。

 

内容はサラッとしか見ていません。

要件で、②と③は①の後に同時に走るとのことなので、kintone.Promise.all 辺りを利用して構築します。

kintone.Promiseとは – cybozu developer network

参考はこの辺りですかね。

おそらく見てると思いますけど、今回のマル様の要件をURLの記事から構築すると

const body = {
  // ...内容
}
// ①の処理
kintone.api(kintone.api.url("/k/v1/records.json", true), "GET", body)
  .then((resp) => {
  // regester_ymd_form 等の処理

    // ②の処理
    const second = new kintone.Promise((resolve, reject) => {
      const body = {
        // ... 内容
      }
      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body)
        .then(() => resolve());
    });

    // ③の処理
    const third = new kintone.Promise((resolve, reject) => {
      const body = {
        // ... 内容
      }
      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body)
        .then(() => resolve());
    });

    return kintone.Promise.all([second, third])
      .then(() => {
        /* ... 処理 ... */ 
      });
  })

みたいな感じになります。

参考になれば幸いでございます。

0
Avatar
マル

新屋 育男様

アドバイスありがとうございました。

記載していただいた内容とkintone.Promiseとは – cybozu developer networkを参照し、ソースを修正しております。

結果の動きはそれなりに動いてはいるのですが、ソースの書き方、新屋様の記載方法(下記)部分に修正前の当方のソースをどのような書き方になるのかがわからないままです。特に、.then(() => resolve());をどのように記載していいのかが、正直わかりません。

もしよければ、再度アドバイスいただければ助かります。

よろしくお願いいたします。

 

0
Avatar
新屋 育男

マル 様

こんにちは。

kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body)
.then(() => resolve());

ここですね。

いや確かによく見たらGET、使ってるのにそのまま処理終了したら意味がないですよね。

GETした値を元に処理をする場合の書き方の一例としては、こんな感じになります。

kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body)
.then((res) => {
const records = res.records // ここに REST APIで GETしてきたrecordsが入る
// ...処理
resolve()
});

イメージとしては、こんな感じになります。

新屋 育男により編集されました
0
Avatar
マル

新屋 育男様

ご丁寧に教えていただきありがとうございました。

サンプルや検索した情報を参考にしておりますが、Javascript素人の為、自分のコードを具体的に落とし込む場合、多少違っていた場合など壁にぶち当たることが多く助かりました。

重ねてお礼申し上げます、ありがとうございました。

 
0
Avatar
マル

そもそも、レコードの持ち方から再設計するべきだと思いますが、新たにべつのアプリよりデータが必要となりました。

上記の➂の処理中、★1のレコード取得で得られたレコード(n件)の情報をもとに、新たに別のアプリから情報を取得し、その情報を★1の項目とともに表示しなければならないとき、➂の処理中でも非同期の処理を待つことはできるものなのでしょうか?

 // ③の処理
    const third = new kintone.Promise((resolve, reject) => {
      const body = {
        // ... 内容
      }
★1      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body)
        .then((res) => {

           ---★1の情報から新たに別アプリを読み、情報を得たい---

     resolve());

                });

    return kintone.Promise.all([second, third])
      .then(() => {
        /* ... 処理 ... */ 
      });

どなたか、お分かりになりましたらご助言いただければ助かります。

0
Avatar
新屋 育男

マル 様

こんにちは。

> 上記の➂の処理中、★1のレコード取得で得られたレコード(n件)の情報をもとに、新たに別のアプリから情報を取得し、その情報を★1の項目とともに表示しなければならないとき、➂の処理中でも非同期の処理を待つことはできるものなのでしょうか?

答えは、できます。

Promise.prototype.then() - JavaScript | MDN (mozilla.org)

この辺りが参考ですね。

0
Avatar
マル

新屋 育男様

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

勉強させていただきます。

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