h1d4k4
1
何を実現したいのかを書きましょう
ルックアップを読込される際に、割当禁止となっているレコードを選択した場合、エラーメッセージを表示させて、ルックアップをクリアしたい
発生した問題やエラーメッセージを具体的に書きましょう
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
});
})();
h1d4k4
2
申し訳ありませんでした。
自己解決いたしました・・・
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);
}
皆様お騒がせしました。
aaa
3
もしよかったら教えてください。
undefinedを使わず void 0とする
メリットなどはあるのですか?
最近は、右辺すら書かずに
if(record['SEL_契約予定名義'].value){
のようにしている例をよく見ます。
h1d4k4
4
確かに右辺を書かないことは多いですが、例えば、
if ( !value )
とした場合、0、null、undefinedがすべてtrueとして回答されてしまいます。
これらがtrueとして判定されても差し支えない処理の場合だと、確かに問題はないのですが、0までtrueにされるとマズいケースなどの場合は、適宜右辺を書く必要性が出てきます。
さて、本題のコード
if (record['SEL_契約予定名義'].value !== void 0) {
ですが、意図しない動作をしないようにするため、右辺をきちんと書いてあります。
また、undefinedについてですが、JavaScriptでは予約語として扱われていないため、undefinedを変数名として使用できてしまいます。
万が一にも使用した状態で、右辺をundefinedにすると、意図しない動作を起こすことも考えられます。
そのため、確実にundefinedが返ってくるvoidを使用する方法か、typeof関数を使用してundefinedであることを確認する方法をとる事をお勧めします。
まとめると、メリットとしては、確実に照合ができるくらいです。
※もしかしたらもっとあるかもしれません。
「いいね!」 1
aaa
5
過去ログを void 0で検索すると
数件ですが、この書き方をしている例を見ました。
今回初めて見て勉強させていただきました。
CやJava、TypeScriptを使わないため新鮮でした。
「いいね!」 1
aaa
6
実験で undefinedを上書きしてみようとおもったのですがグローバルレベルでは設定できませんでした。
最近のブラウザー (JavaScript 1.8.5 / Firefox 4 以降) での undefined
は、 ECMAScript 5 仕様により、設定不可、書込不可のプロパティとなります。 (そうでない場合でも、上書きは避けてください。)
MDNのサイト上の例で
グローバルスコープ以外ならなんとか
(function () {
const undefined = "foo";
console.log(undefined, typeof undefined);
})();
"foo" "string"
「いいね!」 1
h1d4k4
7
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
system
(system)
クローズされました:
8
このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。