【Kintoneカスタマイズ(js)】エラー処理が実行されてもレコード登録ができてしまう

[困っていること]
エラーメッセージが表示されるがレコードの登録がされてしまう

 kintone.proxy(‘https://XXX’, ‘GET’, {

の処理が上手くいかないためエラーメッセージがイベントに格納されても処理が実行されてしまう状況です。

原因は同期処理と判断し、同期処理を実施したもののうまく実行できていない状況です。

[やりたいこと]
エラーの処理が走るときはレコードの登録がされないようにしたい。

[現状]
いくつかのAPIと同期処理が混在しているプログラムとなっており、同期処理が正しいかも不安なプログラムです。

 

どのように改善すれば不具合修正可能なのかをご教授頂けると幸いです。

(function ($) {
    "use strict";
    kintone.events.on(["app.record.create.submit", "app.record.edit.submit"], function (event) {
        var record = event.record;
        var countLineMemberList = memberList.length;//メンバー数を格納
        var errorMessage = "入力に誤りがあります。";
        var errflg = false;
        var i, j = 0;

        //処理省略

        // リクエストパラメータを指定
        var requestParam = {
            //取得してくるレコード
            'app': XXXX
        };

        return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', requestParam).then(function (resp) {
            //処理省略

            //同期処理
            function callbackfunc(callback) {

                // メンバーリストの数だけループ
                const promises = event.record.memberList.value.map(member => {

                    //登録データを取得
                    kintone.proxy('https://XXX', 'GET', {
                        'Authorization': authorization,
                        'Accept': 'application/json'
                    }, {}).then(function (args) {
                        var obj = kintone.app.record.get();

                        //userIdの正規表現で使用する値を代入
                        var checkPatternUserName = record.memberList.value[j].value.userName;

                        //コンストラクタに値を代入し正規表現に用いる

                        var regexUserName = new RegExp('"' + checkPatternUserName.value + '"');

//testメソッドを実行。userIdが一致しなければ実行

                        if (regexUserName.test(args[0]) === false) {
                            obj.error = errorMessage;
                            obj.record.memberList.value[j].value.userId.error = 'エラーメッセージ';

                            console.log(record.memberList.value[j].value.userId.error);
                            kintone.app.record.set(obj);
                            console.log("NG");
                        } else {
                            //処理なし
                        }
                        j++;
                    }).catch(function () {
                        event.error = 'レコード取得エラー';
                        return event;
                    });

                    //iを使った処理 
//promiseを返す

return promise;
              });
                Promise.all(promises).then(() => {
                    console.log(event);
                    return event;
                    callback();
                });
            }
            function message() {
                    if (errflg) {
                        event.error = errorMessage;
                    }
                    console.log("OK");
                    console.log(event);
                    return event;
            }
            callbackfunc(message);
        }).catch(function () {
            event.error = 'レコード取得エラー';
            return event;
        });
    });
})();

 

 

ソースの中身はよく見てないですけど、return eventするとsubmitされてしまいますよ。

}).catch(function () {
event.error = ‘レコード取得エラー’;
return event;
});

submitをキャンセルしたいのであればfalseを返してあげるとよいですよ。

}).catch(function () {
event.error = ‘レコード取得エラー’;
return false;
});

 

誤情報です。すみません。

kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function (event) {
event.error = 'エラーメッセージ';
return event;
})

とすれば、エラーが表示されてsubmitはされません。
エラーを設定してるのに保存されてしまう場合は、正しくeventがreturnされていないためです。

お詫びとともに訂正いたします。

ご回答頂きありがとうございます。

falseを返すことでキャンセルが行えること知らずに利用していました。

ありがとうございます。反映して挙動確認してみます。

ごめんなさい、嘘をつきました。<(_ _)>

eventにerrorをセットしたらreturn eventでエラーが表示されてsubmitはされないはずです。
(errorがあるのをなぜか見落としていました・・・)

return falseしてしまうとsubmitもされませんがerrorも表示されません。

何がおかしいのかもう一度確認しますので少々お待ちを。。。

まず1点

callbackfunc(message);

この部分は

return callbackfunc(message);

としてあげないと、callbackfuncの中のreturnが戻ってきません。
それから

Promise.all(promises).then(() => {
    console.log(event);
  return event; // ここでreturnされてしまうので
  callback(); // ここは実行されない
});

ここはreturn event以下の callback() は実行されません。

 

このあたり直してみたらどうなるでしょうか?
※先の誤った情報は書き直しておきます。。

 

とんでもございません。ご対応ありがとうございます。

callbackの位置間違ってますね。。

ありがとうございます。修正してみます。

 

すみません、上記の記載みててハッとしたのですが

下記のPromiseの前にreturn付け忘れの可能性とかってありますでしょうか。そのため同期されていないのかなと。。。

(今確認できないため後程確認してみます。)

(return) Promise.all(promises).then(() =\>{

あ、そっちもですかね(^ ^;)。。。

とかくthenで階層を深くしていくと何が何だかわからなくなりがちなので
async awaitを使った方が見た目的にシンプルになって、return漏れも減らせることが多い印象です。
(逆にawait漏れが出てきたりしますが…)

全く気づきませんでした。。。

 

ありがとうございます。構造がややこしいく困ることが多いので以降はasync awaitで実装していこうと思います。

ご回答頂きありがとうございました。

無事解決できそうです!