async/awaitでのLookup処理について

何を実現したいのかを書きましょう

ルックアップを読込される際に、割当禁止となっているレコードを選択した場合、エラーメッセージを表示させて、ルックアップをクリアしたい

発生した問題やエラーメッセージを具体的に書きましょう

Uncaught (in promise) Error: app.record.create.change.U_住所2 is not allowed to return “Thenable” object.
上記エラーが表示されるが、なぜか処理自体は成功する状況。

実行したコードをコピー&ペーストしましょう

(() => {
    'use strict';
    kintone.events.on(['app.record.create.change.U_住所2'], async (event) => {
        //契約名義の取込イベント時に判定
        const record = event.record;

        console.log(record['SEL_契約予定名義'].value)
        if (record['SEL_契約予定名義'].value !== void 0) {
            const api1 = {
                app: 5,
                query: '統一コード = "' + record['SEL_契約予定名義'].value + '"',
                fields: ['フラグ']
            };

            const resp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', api1)
            if (resp.records[0].フラグ.value.indexOf('割当禁止') > -1) {
                //割当禁止があるため、拒否設定
                await Swal.fire({
                    title: '紐付エラー [SO-CHCK-E1001]',
                    text: 'このデータは紐付禁止に設定されています。',
                    icon: 'error'
                })

                let recordData = kintone.app.record.get(), rec = recordData.record;
                rec['SEL_契約予定名義'].lookup = 'CLEAR';
                kintone.app.record.set(recordData);
            }
        }

        return event
    });
})();

申し訳ありませんでした。
自己解決いたしました・・・

changeイベントの際はasync使えないんでした・・・
以下のコードに修正したら、エラーが発生しなくなりました。

'use strict';
kintone.events.on(['app.record.create.change.U_住所2'], event => {
    //契約名義の取込イベント時に判定
    start_hantei();
    //console.log({ event })
    return event
});


const start_hantei = async() => {
    await Promise.resolve();
    let record_load = kintone.app.record.get(), record = record_load.record
    if (record['SEL_契約予定名義'].value !== void 0) {
        const api1 = {
            app: 5,
            query: '統一コード = "' + record['SEL_契約予定名義'].value + '"',
            fields: ['フラグ']
        };
    
        const resp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', api1)
        if (resp.records[0].フラグ.value.indexOf('割当禁止') > -1) {
            //割当禁止があるため、拒否設定
            await Swal.fire({
                title: '紐付エラー [SO-CHCK-E1001]',
                text: 'このデータは紐付禁止に設定されています。',
                icon: 'error'
            })
            record['SEL_契約予定名義'].lookup = 'CLEAR';
        }
    }
    kintone.app.record.set(record_load);
}

皆様お騒がせしました。

もしよかったら教えてください。

undefinedを使わず void 0とする
メリットなどはあるのですか?
最近は、右辺すら書かずに

if(record['SEL_契約予定名義'].value){

のようにしている例をよく見ます。

確かに右辺を書かないことは多いですが、例えば、

if ( !value )

とした場合、0、null、undefinedがすべてtrueとして回答されてしまいます。
これらがtrueとして判定されても差し支えない処理の場合だと、確かに問題はないのですが、0までtrueにされるとマズいケースなどの場合は、適宜右辺を書く必要性が出てきます。

さて、本題のコード

if (record['SEL_契約予定名義'].value !== void 0) {

ですが、意図しない動作をしないようにするため、右辺をきちんと書いてあります。
また、undefinedについてですが、JavaScriptでは予約語として扱われていないため、undefinedを変数名として使用できてしまいます。
万が一にも使用した状態で、右辺をundefinedにすると、意図しない動作を起こすことも考えられます。
そのため、確実にundefinedが返ってくるvoidを使用する方法か、typeof関数を使用してundefinedであることを確認する方法をとる事をお勧めします。

まとめると、メリットとしては、確実に照合ができるくらいです。
※もしかしたらもっとあるかもしれません。

1 Like

過去ログを void 0で検索すると
数件ですが、この書き方をしている例を見ました。

今回初めて見て勉強させていただきました。
CやJava、TypeScriptを使わないため新鮮でした。

1 Like

実験で undefinedを上書きしてみようとおもったのですがグローバルレベルでは設定できませんでした。

最近のブラウザー (JavaScript 1.8.5 / Firefox 4 以降) での undefined は、 ECMAScript 5 仕様により、設定不可、書込不可のプロパティとなります。 (そうでない場合でも、上書きは避けてください。)

MDNのサイト上の例で
グローバルスコープ以外ならなんとか

(function () {
  const undefined = "foo";
  console.log(undefined, typeof undefined);
})();
"foo" "string"
1 Like

undefinedの上書き実験について試されたのですね!
aaaさんのおっしゃる通りで、ECMAScript 5からは、上書きを許可しなくなっています。

no-undefined - ESLint - Pluggable JavaScript Linter

ただ、あくまでも予約語ではない事は非常に注意しなければなりません。

字句文法 - JavaScript | MDN (mozilla.org)

また、undefined自体は前回も書きましたが、代入可能な変数である事には変わりがありません。そのため、実装の仕方によっては、undefinedに別の値が代入されてしまうことがあり得てしまいます。

パターンA

var undefined = "TEST"

function test(t) {
  console.log(undefined)
  if (t === undefined) {
    return 'Undefined value!';
  }
  return t;
}

let x;

console.log(test(x));
// Expected output: "Undefined value!"

パターンB

function test(t) {
  undefined = "TEST"
  console.log(undefined)
  if (t === undefined) {
    return 'Undefined value!';
  }
  return t;
}

let x;

console.log(test(x));
// Expected output: "Undefined value!"

パターンC

function test(t) {
  const undefined = "TEST"
  console.log(undefined)
  if (t === undefined) {
    return 'Undefined value!';
  }
  return t;
}

let x;

console.log(test(x));
// Expected output: "Undefined value!"

パターンD

const undefined = "TEST"

function test(t) {
  console.log(undefined)
  if (t === undefined) {
    return 'Undefined value!';
  }
  return t;
}

let x;

console.log(test(x));
// Expected output: "Undefined value!"

上記の4例では、パターンB以外はすべて処理が成立しなくなり、

> "TEST"
> undefined

と返されます。

パターンBにおいては、

> undefined
> "Undefined value!"

と意図した結果が返ります。

2 Likes

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。