SweetAlert2 使用して確認ダイアログを表示した後に、
複数アプリを更新してから(任意のタイミングで)
ページを更新する方法が分からず、ご教示いただけますと幸いです。
- kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’],
- function(event) {
-
return new kintone.Promise(function(resolve, reject) {
-
// フィールド情報の取得
-
var str\_torihikisaki\_mei = event.record['取引先名'].value;
-
// エラーチェック
-
if (str\_torihikisaki\_mei === '') {
-
// 取引先名
-
swal.fire({
-
text: '「取引先名」は必須入力です。',
-
type: 'error',
-
});
-
resolve(false);
-
} else {
-
// 確認ダイアログの表示
-
swal.fire({
-
title: '確認',
-
text: '情報を保存しますか?',
-
type: 'success',
-
}).then(function(isConfirm) {
-
if (isConfirm.dismiss !== 'cancel') {
-
// はい
-
related\_apps\_update(event); // 関連する別アプリを更新(複数アプリを更新)
-
resolve(event);
-
} else {
-
// いいえ
-
resolve(false);
-
}
-
});
-
}
-
});
- });
上記のように、行23. でファンクションの related_apps_update で
複数のアプリを更新した後に、ページを更新するようにしたいのですが、
更新中にページが更新されて、複数のアプリの全てが
更新できていないタイミングで更新が中断されてしまいます。
こちらの解決方法について、ご教示いただけますでしょうか。
何卒よろしくお願いいたします。
related_apps_updateの直後にすぐresolve()してるのが悪そうですね。
related_apps_updateもPromiseやCallbackなどに対応するようにしてみてください。
(上記のコードでは return new kintone.Promise…してますよね、同じ感じにrelated_apps_updateも全部が終わったときにresolve()するように変更すればOKです)
イメージは、下記の様になるかと思います。
related_apps_update()をPromiseを返すようにした場合
related_apps_update(event).then(function(){
resolve(event);
});
related_apps_update()完了後にCallbackを実行するようにした場合
related_apps_update(event, function(){
resolve(event);
});
特段の理由がなければPromise版のほうがいいかと思います。
ご回答いただき、ありがとうございます。
お伝え頂いた記述を適用して、実行したところ、
「Uncaught (in promise) TypeError: Cannot read property ‘then’ of undefined」
といった、エラーが発生するようになりました。
こちらは、ファンクション related_apps_update の内容に
問題がある可能性も考えられますので、以下に記載します。
- function related_apps_update(event) {
-
// フィールドの情報を取得
-
var str\_torihikisaki\_mei = event.record['取引先名'].value;
-
var str\_bumon = event.record['部門'].value;
-
var str\_syubetsu = event.record['種別'].value;
-
// 一時フィールドの情報を取得
-
var str\_temp\_torihikisaki\_mei = event.record['一時\_取引先名'].value;
-
var str\_temp\_bumon = event.record['一時\_部門'].value;
-
var str\_temp\_syubetsu = event.record['一時\_種別'].value;
-
// 対象のアプリを更新
-
var apps = [app\_id\_a, app\_id\_b, app\_id\_c, app\_id\_d, app\_id\_e];
-
apps.forEach(function(id) {
-
var obj = [];
-
var quary\_result = [];
-
var record\_update = [];
-
fetchRecords(
-
id,
-
'取引先名 = "' + str\_temp\_torihikisaki\_mei + '" ' +
-
'and 部門 = "' + str\_temp\_bumon + '" ' +
-
'and 種別 in ("' + str\_temp\_syubetsu + '")',
-
['レコード番号']
-
).then(function(records) {
-
obj = convertToRows(records);
-
}).then(function(records) {
-
quary\_result = obj;
-
if (quary\_result.length \> 0) {
-
quary\_result.forEach(function(value) {
-
record\_update.push(
-
{
-
'id': Number(value['レコード番号']),
-
'record':
-
{
-
'取引先名': { 'value': str\_torihikisaki\_mei },
-
'部門': { 'value': str\_bumon },
-
'種別': { 'value': str\_syubetsu }
-
}
-
});
-
});
-
record\_update = { 'app': id, 'records': record\_update };
-
kintoneUtility.rest.putRecords(record\_update).then(function(resp) {
-
// 成功
-
return event;
-
}).catch(function(error) {
-
// エラー時の処理を記載する
-
console.log(error.message);
-
});
-
}
-
});
-
});
- }
以上を踏まえまして、解決方法を
ご教示いただけますと大変幸いです。
何卒よろしくお願いいたします。
related_apps_updateでPromiseをリターンしてないからですね。
kintoneのイベントハンドラに書いてるのと同じく、こんな感じの構造にしてみてください。
return new kintone.Promise(function(resolve, reject) { // promiseをreturn
// 中略
kintoneUtility.rest.putRecords(record\_update).then(function(resp) {
// 成功
resolve(event);
}
// 中略
Promise に関するTipsも共有いただき、ありがとうございます!
これは…会得必須の内容であります。
参考にさせていただきます!