前々回において、次のことを書いた。
郵便番号を検証する機能をさらに、入力の有無をチェックする機能と、入力有りの場合に7桁の数字であるかどうかをチェックする機能に分けようと思った。
入力の有無をチェックする機能が完成したところで、次に「入力有りの場合に7桁の数字であるかどうかをチェックする機能」に進みたいと思う。
この機能はすでにChatGPTによってvalidatePostCodeという関数として作られている。ということでやることは、この関数から余分のコードを取り除き、きれいに整えることになる。
さっそく眺め始める…
function validatePostCode() {
return new Promise((resolve, reject) => {
let postalCode = document.getElementById('postal_code').value.replace(/-/g, ''); // 郵便番号の入力を受け取る。ハイフンを削除して7桁の数字にする。
if (postalCode !== "") { // 未入力時はエラーを発生させない
if (!/^\d{7}$/.test(postalCode)) {
reject({ code: errorCodes.INVALID_POSTAL_CODE, field: 'postal_code' });
} else {
resolve(postalCode);
}
} else {
reject({ code: errorCodes.POSTAL_CODE_EMPTY, field: 'postal_code' });
}
});
}
で、いきなり2行目がよくわからない。具体的にいうと「Promise」がわからない。私のプログラミング知識を超えているのである。
Promiseについて
Promiseは非同期処理の結果を表す
この回答でわかることは、
- Promiseはオブジェクトである。
- Promiseには3つの状態がある。
- Promiseは「非同期処理」の結果を表す。
- Promiseは非同期処理の成否によって処理を分岐させられる。
の4つである。「コールバック地獄」云々はよくわからないけど、この際深入りしない。
同じ回答には使用例もついている。
上記の使用例とその上の回答で、次の理解に至った。果たして合っているだろうか。
よかった!よかった!
resolve, reject, then, catch, finallyはすべて関数
さてだいたい理解ができたところで次に進みたいが、resolveとrejectはそれぞれ何なのか、具体的に言うと、関数?オブジェクト?がとても気になり、聞いてみた。
なるほど関数なんだね。オブジェクト内の関数。
じゃthen、catch、finallyはどうか。コマンドのように見えるが…
これらもすべて関数である。
非同期処理について
非同期処理は同時に複数の処理ができる仕組みのこと
次に、Promiseが使われる場面である「非同期処理」について確認したい。これはだいたいわかっているのだが、モヤモヤな部分があるので、改めてということで。
住所変換機に置き換えると、つまり次のことかと思う。
これで非同期処理について十分理解できたと思う。
「同期」・「非同期」という言い方はちょっとわかりにくい
で、なぜ大体理解していながら、ずっとモヤモヤだったのかというと、「非同期」という言い方がどうもわかりくくて、しっくりこなかったからである。
要するに次のようなことだ。
No, no, no English! 6サイト検索してくれたことは嬉しいが、前触れなく英語で回答してくるのは勘弁してほしい。
しかしこの点についてChatGPTから要領を得た回答を得ることができなかった。いわく、
上記は漢字の意味と実際が矛盾しているという私たの指摘を無視した回答である。
でも、この点について疑問に思っている人は私だけではないはず。そう思ってネットで自分と同じ問題提起を探してみた。そしてあった。
プログラミングとかの「同期処理」って、なんで「同期」なんですか?
ふつう「同期」っていうと、2つの何かがあってそれぞれのタイミングや内容を合わせる、みたいな印象を持つと思うのですが… (例:周波数、スマホの写真フォルダ等) プログラミングの「同期処理」っていうのはつまり非同期処理ではないこと(説明が雑過ぎる)だと理解してるのですが、この処理に「同期」のイメージをぜんぜん感じません。
なんでこんなわかりにくい名前なんですか? 「直列処理」とかの方がよっぽどわかりやすいです。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14287107734
同じように思う人の存在が確認できて安心した。
このわかりにくい表現は翻訳のせいかというと、そうでもない。英語の「synchronous」(同期)と「asynchronous」(非同期)も言葉の意味の上では同じ矛盾を抱えており、特に英語を母語としないプログラマーの中には、私と同じように混乱し、疑問を持っている人もいるようだ。
そして下記サイトの回答によると、「synchronous」と「asynchronous」はクロック信号が起源で、元々はクロック信号における現象をよく表現できていたのだが、プログラミングの世界に導入され、タスクのプロセス(流れ)に使われるようになったのが矛盾の出どころのようだ。英語力が低いので、上記の理解で合っているかどうか自身がないが…
https://stackoverflow.com/questions/1596589/why-are-asynchronous-processes-not-called-synchronous
しかし似たような言葉をもう1つ思い出した。「ブラックホール」だ。中国語では「黒洞」。この言葉のせいで、かなりの間わたしはブラックホールは宇宙空間にぽかっと空いた穴だと思っていた。「ブラックボール」だから、そんな誤解は生じなかったはずだ。
Promiseの理解だけでかなり長くなったので、コードの検証は次回とする。それでは。