Promiseは非同期処理の結果を表すオブジェクトである

shallow focus photo of white and gray cat

JavaScriptのPromise(プロミス)とは、非同期操作の結果を表すオブジェクトです。
(中略)
Promiseは、非同期処理の結果が成功するか失敗するかに応じて、その後に実行する処理を指定するために使用されます。

ChatGPT

前々回において、次のことを書いた。

郵便番号を検証する機能をさらに、入力の有無をチェックする機能と、入力有りの場合に7桁の数字であるかどうかをチェックする機能に分けようと思った。

入力の有無をチェックする機能が完成したところで、次に「入力有りの場合に7桁の数字であるかどうかをチェックする機能」に進みたいと思う。

この機能はすでにChatGPTによってvalidatePostCodeという関数として作られている。ということでやることは、この関数から余分のコードを取り除き、きれいに整えることになる。

さっそく眺め始める…

JavaScript
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は非同期処理の結果を表す

WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

この回答でわかることは、

  1. Promiseはオブジェクトである。
  2. Promiseには3つの状態がある。
  3. Promiseは「非同期処理」の結果を表す。
  4. Promiseは非同期処理の成否によって処理を分岐させられる。

の4つである。「コールバック地獄」云々はよくわからないけど、この際深入りしない。

同じ回答には使用例もついている。

WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

上記の使用例とその上の回答で、次の理解に至った。果たして合っているだろうか。

Promiseオブジェクトを作り、その中にで処理を走らせ、成功した場合はにはresolveを、失敗した場合はrejectを返す。そしてresolveが返されたらthenの処理を、rejectが返されたらcatchの処理を、成否にかかわらず最後に何かを実行する場合はfinallyの処理を実行すると理解したが、この理解て合っていますか?

はい、いいえで答えてください。いいえの場合だけ、間違っている理解を正してください。
WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

よかった!よかった!

resolve, reject, then, catch, finallyはすべて関数

さてだいたい理解ができたところで次に進みたいが、resolveとrejectはそれぞれ何なのか、具体的に言うと、関数?オブジェクト?がとても気になり、聞いてみた。

resolveとrejectはそれぞれなんですか?簡単に答えてください。
WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

なるほど関数なんだね。オブジェクト内の関数。

じゃthen、catch、finallyはどうか。コマンドのように見えるが…

then, catch, finallyはそれぞれコマンドですか?関数ですか?
WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

これらもすべて関数である。

非同期処理について

非同期処理は同時に複数の処理ができる仕組みのこと

次に、Promiseが使われる場面である「非同期処理」について確認したい。これはだいたいわかっているのだが、モヤモヤな部分があるので、改めてということで。

非同期処理とは?簡単に説明して。
WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

住所変換機に置き換えると、つまり次のことかと思う。

WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

これで非同期処理について十分理解できたと思う。

「同期」・「非同期」という言い方はちょっとわかりにくい

で、なぜ大体理解していながら、ずっとモヤモヤだったのかというと、「非同期」という言い方がどうもわかりくくて、しっくりこなかったからである。

要するに次のようなことだ。

WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

No, no, no English! 6サイト検索してくれたことは嬉しいが、前触れなく英語で回答してくるのは勘弁してほしい。

しかしこの点についてChatGPTから要領を得た回答を得ることができなかった。いわく、

WordPressでは、デフォルトの機能だけではユーザーのアバター画像を直接変更することはできません。通常、アバター画像はGravatarという外部サービスを通じて管理されます。GravatarはWordPress.comと統合されており、ユーザーのメールアドレスに基づいてアバター画像を表示します。

しかし、WordPress自体でアバター画像を変更するためのプラグインがあります。以下にいくつかの方法を紹介します。

上記は漢字の意味と実際が矛盾しているという私たの指摘を無視した回答である。

でも、この点について疑問に思っている人は私だけではないはず。そう思ってネットで自分と同じ問題提起を探してみた。そしてあった。

プログラミングとかの「同期処理」って、なんで「同期」なんですか?

ふつう「同期」っていうと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の理解だけでかなり長くなったので、コードの検証は次回とする。それでは。