ms-hashimoto様
いつもありがとうございます。懇切丁寧なご説明のおかげで、公式ドキュメントを読んでもいまいち理解できていなかった部分の理屈は理解できたと思います。
コード修正について、いくつか疑問があり、大変恐縮ですが、お教えください。
前提として、このコードはもう少し長い処理の一部であり、発火イベントは下記通りです。いくつか入力値の整合性をチェックしているので、submitではなく、正常に保存できることを担保できた状態、successが条件となります。
やりたいことは
①Google認証(出来ているので割愛)
※ここでsubmit.successを踏む
②保存されたレコードからカレンダー登録への必要値の取得、params作成。Googleカレンダーへparamsを受け渡し(出来ているので割愛)
③カレンダー登録成功のイベントを受け取ったら、そのeventIDをもとのkintoneのレコードへ入力する(promise2つめの’PUT’のところ)
④eventIDの入力も成功したら、このレコードは終了。
⑤ユーザーに新しいレコード登録を促し、新規レコード作成画面を開いてあげる
以上の手順です。③の辺りからpromiseの概念が出てきており、また、もともと前任者の方が書いてくださったコードを改変しているのですが、ご指摘のとおりJavaScript知識が乏しいままで、promiseを正しく理解・記述できていないがゆえに、こんがらがってしまっているのです。
いただきましたご返信拝読し、そのうえで、公式ドキュメントを見つつ、ご指摘いただきました部分をコード修正をしようと思ったのですが、resp、event、then、resolveといった要素がどう絡んでいるのかどうしても自力で解決できません。
下記の修正いただいたコードでまず引っかかってしまっています。
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', kintbody,(resp) => {
resolve(event);
}, (error) => {
console.error(error);
});
ここでresolve(event);をすると、どこに返されるのでしょうか?submit.successの階層まで一気に返されてしまうのでしょうか……?
(resp)で成功の場合の値を拾っていると思っていて、respに成功のイベントが返ってこなかったら(respが空だったら)エラー処理をする…だと思っていたので、混乱しております。
公式ドキュメントを何度読んでも、少しでもコードの書き方の違う部分があると、それを自分のコードの場合に置き換えて当てはめることができずにおります…(本当に、初歩の初歩が固まっていないままなので何度も行き詰り、すみません。)
今、階層が3つあると思っています。
①submit.successの層(return eventで閉じるものと理解)
②1つめのpromise(カレンダー登録実行)(resolve(false)とresolve(true)で閉じている様子。前任者の書いてくれた部分です。)
③2つめのpromise(kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, kintbody,(resp) => {○×○× (これはreturn(resp)なのか、return(event)なのか、理解できておらず)
③をちゃんと閉じてあげる。そのあとに②を閉じてあげる。最後に①をちゃんと終わらせる。
その整理を、今一度ご助力願えないでしょうか…… コールバック地獄に陥っているのですね、解読も難儀すると思い、申し訳ない限りです……
ご多忙の折、お手数おかけし、申し訳ございません。
下記、コードです。
(function googleCalendarAlignment() {
"use strict";
kintone.events.on(["app.record.create.submit.success", "app.record.edit.submit.success"],
(event) => {
//ここでカレンダー登録を実行するための処理を行っています(省略)
//条件を満たしたので、カレンダー処理を呼び出す。
return upsertCalendar(recordId, record);
//この辺ではGoogleカレンダー用のparamを作成したりする処理を行っています(省略)
// ここまで無事に来たので、Googleカレンダーへのイベント登録の実行。呼び出し非同期処理として受け取れるよう、Promise化
return new kintone.Promise(function (resolve, reject) {
request.execute((resp) => {
if (resp.error) {
alert("イベントの登録に失敗しました。" + resp.error.message);
resolve(false);
} else {
alert("イベント登録成功しました。" + resp.result.id);
const kintbody = {
'app': kintone.app.getId(),
'id': record.$id.value,
'record': {
'event_id': {
'value': resp.result.id
}
}
};
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', kintbody,(resp) => {
//ここにreturn(event);を置くとどこの階層までリターンするのでしょうか…?respとeventの使い分けがわかっていません…
}, (resp) => {
// error:エラーの場合はもう一回やる?検討中
kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', kintbody,(resp));
});
resolve(true);//←←これは本来どこに置かれるべきなのでしょうか…
let appid = XXX; //開きたいアプリのID
let nowRecordID = record.$id.value;
if (record["もう一つ登録"].value === "あり") {
let res = confirm("保存しました。あたらしい登録画面へ遷移します。");
if(res){
window.open('/k/XXX/edit?action=XXXXXXX&app=XXX&record=' + nowRecordID, '_blank');
}
}
}
});
});