いつもお世話になっております。
レコード追加イベントの際に、別アプリから会社名を取得して表示させたいのですが、関数から会社名がうまく戻りません。
関数内部で取得できているのは確認しているのですが、値を戻す前に処理が進んでいるのが原因なのかなと自分では感じています。
どのように記載すれば上手く戻すことが可能でしょうか?
よろしくお願いします。
(function() {
'use strict';
const events1 = ['app.record.create.show'];
function getsyamei() {
var body = {
app: 51,
id: 34
};
return new kintone.Promise(function(resolve, reject) {
kintone.api(kintone.api.url('/k/v1/record', true), 'GET', body, function(resp) {
var record = resp.record;
resolve(event);
return record.syamei.value;
}, function(err) {
reject(err);
});
});
}
kintone.events.on(events1, function(event) {
var syamei = getsyamei();
console.log('syamei: ' + syamei);
event.record.kaisyamei.value = syamei;
return event;
});
})();
> 値を戻す前に処理が進んでいるのが原因なのかなと自分では感じています。
その推察のとおりですね。
create.showはPromiseに対応してませんので(対応していたとしても書き方的には処理が進んでしまうようになっていますが)、
return eventのときに反映させることができません。
非同期でcreate.showのタイミングでフィールドの値を書き換えたい場合は、
kintone.app.records.set() を使ってください。具体的には、getsyamei()のような関数の中でやるのが手っ取り早いではあります。
https://developer.cybozu.io/hc/ja/articles/201942014-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E8%A9%B3%E7%B4%B0%E6%83%85%E5%A0%B1%E5%8F%96%E5%BE%97#step4
ご返信遅くなり申し訳ありません。
また、ご回答いただきありがとうございます。
Promiseが動かないイベントがあるのをすっかり忘れてました・・・再度勉強しなおします。
また、別件になるのですが
>対応していたとしても書き方的には処理が進んでしまうようになっていますが
もしお時間があるようでしたら、こちらの内容も少しお話伺えませんでしょうか?
というのも、別処理で[create.submit]、[edit.submit]イベントの際に
関数内のAPIでGETして、その値を使ってPOST/PUTを行う予定なのですが
上記コードの
event.record.kaisyamei.value = syamei;
この部分をpromiseでのPOST/PUT処理を行うだけでは動かないのでしょうか?
本来なら実際に自分で試してみるべき内容ですが、即時関数からの関数呼び出しが上手く理解できないため
お時間ある時で構いませんので、ご教授頂ければ幸いです。
>>対応していたとしても書き方的には処理が進んでしまうようになっていますが
> もしお時間があるようでしたら、こちらの内容も少しお話伺えませんでしょうか?
promiseはreturnしてあげないと意味がないということです。getsyamei()の中ではreturnしていますが、それを使う
var syamei = getsyamei();
の部分でPromiseを待っていないということですね。
Promiseに対応しているイベントは、
return event; のかわりに、Promiseをreturnすることによって待つことができます。
下記記事のように、Promiseをreturnできるように組み立てる必要があります。
https://developer.cybozu.io/hc/ja/articles/360023047852-kintone%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BPromise%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AE%E5%9F%BA%E6%9C%AC
ご返信頂きありがとうございます。
教えて頂いたURLを見てチェーンで繋ぐイメージがなんとなく掴めた気がします。
今後は実戦でより理解を深めていきたいと思います。ありがとうございました。
はい、promiseに対応したイベント(submit)などは、PromiseオブジェクトをReturnすると待ってくれる、というのがミソですね!