ボタンをクリック後、別アプリ➀、別アプリ➁、別アプリ➂の各アプリの情報を取得したいのですが、別アプリ➁、別アプリ➂では別アプリ➀で入手して得られた情報(register_ymd_from)をもとに別アプリ➁、別アプリ➂のレコードを取得したいのです。
しかし、非同期処理の為、register_ymd_fromがundefinedとして怒られます。
いろいろ調べるとPromise もしくは async/awaitを借りて処理ができそうな感じなのですが、初心者の為、そもそも別アプリ➀→別アプリ➁→別アプリ➂での処理自体はアリなのでしょうか。
又、async/await を調べて、幾つか試したのですが
エラー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;
});
7件のコメント
マル 様
こんにちは。
プロミス難しいですよね。
内容はサラッとしか見ていません。
要件で、②と③は①の後に同時に走るとのことなので、kintone.Promise.all 辺りを利用して構築します。
kintone.Promiseとは – cybozu developer network
参考はこの辺りですかね。
おそらく見てると思いますけど、今回のマル様の要件をURLの記事から構築すると
みたいな感じになります。
参考になれば幸いでございます。
新屋 育男様
アドバイスありがとうございました。
記載していただいた内容とkintone.Promiseとは – cybozu developer networkを参照し、ソースを修正しております。
結果の動きはそれなりに動いてはいるのですが、ソースの書き方、新屋様の記載方法(下記)部分に修正前の当方のソースをどのような書き方になるのかがわからないままです。特に、.then(() => resolve());をどのように記載していいのかが、正直わかりません。
もしよければ、再度アドバイスいただければ助かります。
よろしくお願いいたします。
マル 様
こんにちは。
ここですね。
いや確かによく見たらGET、使ってるのにそのまま処理終了したら意味がないですよね。
GETした値を元に処理をする場合の書き方の一例としては、こんな感じになります。
イメージとしては、こんな感じになります。
新屋 育男様
ご丁寧に教えていただきありがとうございました。
サンプルや検索した情報を参考にしておりますが、Javascript素人の為、自分のコードを具体的に落とし込む場合、多少違っていた場合など壁にぶち当たることが多く助かりました。
重ねてお礼申し上げます、ありがとうございました。
そもそも、レコードの持ち方から再設計するべきだと思いますが、新たにべつのアプリよりデータが必要となりました。
上記の➂の処理中、★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(() => {
/* ... 処理 ... */
});
どなたか、お分かりになりましたらご助言いただければ助かります。
マル 様
こんにちは。
> 上記の➂の処理中、★1のレコード取得で得られたレコード(n件)の情報をもとに、新たに別のアプリから情報を取得し、その情報を★1の項目とともに表示しなければならないとき、➂の処理中でも非同期の処理を待つことはできるものなのでしょうか?
答えは、できます。
Promise.prototype.then() - JavaScript | MDN (mozilla.org)
この辺りが参考ですね。
新屋 育男様
情報ありがとうございました。
勉強させていただきます。