SweetAlert2 確認ダイアログの後に任意のタイミングでページを更新

SweetAlert2 使用して確認ダイアログを表示した後に、

複数アプリを更新してから(任意のタイミングで)

ページを更新する方法が分からず、ご教示いただけますと幸いです。

 

  1. kintone.events.on([‘app.record.create.submit’, ‘app.record.edit.submit’],
  2. function(event) {
  3. return new kintone.Promise(function(resolve, reject) {
    
  4.   // フィールド情報の取得
    
  5.   var str\_torihikisaki\_mei = event.record['取引先名'].value;
    
  6.   // エラーチェック
    
  7.   if (str\_torihikisaki\_mei === '') {
    
  8.     // 取引先名
    
  9.     swal.fire({
    
  10.       text: '「取引先名」は必須入力です。',
    
  11.       type: 'error',
    
  12.     });
    
  13.     resolve(false);
    
  14.   } else {
    
  15.     // 確認ダイアログの表示
    
  16.     swal.fire({
    
  17.       title: '確認',
    
  18.       text: '情報を保存しますか?',
    
  19.       type: 'success',
    
  20.     }).then(function(isConfirm) {
    
  21.       if (isConfirm.dismiss !== 'cancel') {
    
  22.         // はい
    
  23.         related\_apps\_update(event); // 関連する別アプリを更新(複数アプリを更新)
    
  24.         resolve(event);
    
  25.       } else {
    
  26.         // いいえ
    
  27.         resolve(false);
    
  28.       }
    
  29.     });
    
  30.   }
    
  31. });
    
  32. });

 

上記のように、行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 の内容に

問題がある可能性も考えられますので、以下に記載します。

 

  1. function related_apps_update(event) {
  2. // フィールドの情報を取得
    
  3. var str\_torihikisaki\_mei = event.record['取引先名'].value;
    
  4. var str\_bumon = event.record['部門'].value;
    
  5. var str\_syubetsu = event.record['種別'].value;
    
  6. // 一時フィールドの情報を取得
    
  7. var str\_temp\_torihikisaki\_mei = event.record['一時\_取引先名'].value;
    
  8. var str\_temp\_bumon = event.record['一時\_部門'].value;
    
  9. var str\_temp\_syubetsu = event.record['一時\_種別'].value;
    
  10. // 対象のアプリを更新
    
  11. var apps = [app\_id\_a, app\_id\_b, app\_id\_c, app\_id\_d, app\_id\_e];
    
  12. apps.forEach(function(id) {
    
  13.   var obj = [];
    
  14.   var quary\_result = [];
    
  15.   var record\_update = [];
    
  16.   fetchRecords(
    
  17.     id,
    
  18.     '取引先名 = "' + str\_temp\_torihikisaki\_mei + '" ' +
    
  19.     'and 部門 = "' + str\_temp\_bumon + '" ' +
    
  20.     'and 種別 in ("' + str\_temp\_syubetsu + '")',
    
  21.     ['レコード番号']
    
  22.   ).then(function(records) {
    
  23.     obj = convertToRows(records);
    
  24.   }).then(function(records) {
    
  25.     quary\_result = obj;
    
  26.     if (quary\_result.length \> 0) {
    
  27.       quary\_result.forEach(function(value) {
    
  28.         record\_update.push(
    
  29.         {
    
  30.           'id': Number(value['レコード番号']),
    
  31.           'record':
    
  32.           {
    
  33.             '取引先名': { 'value': str\_torihikisaki\_mei },
    
  34.             '部門': { 'value': str\_bumon },
    
  35.             '種別': { 'value': str\_syubetsu }
    
  36.           }
    
  37.         });
    
  38.       });
    
  39.       record\_update = { 'app': id, 'records': record\_update };
    
  40.       kintoneUtility.rest.putRecords(record\_update).then(function(resp) {
    
  41.         // 成功
    
  42.         return event;
    
  43.       }).catch(function(error) {
    
  44.         // エラー時の処理を記載する
    
  45.         console.log(error.message);
    
  46.       });
    
  47.     }
    
  48.   });
    
  49. });
    
  50. }

 

以上を踏まえまして、解決方法を

ご教示いただけますと大変幸いです。

 

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

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は必須になるので覚えておいて損はないと思います。

 

Promiseにまよったら下記もごらんください!

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

Promise に関するTipsも共有いただき、ありがとうございます!

これは…会得必須の内容であります。

参考にさせていただきます!