質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

917閲覧

await/asyncで値取得に失敗したときにエラーメッセージを表示する書き方

3_April_2021

総合スコア48

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/09/11 07:21

目的処理に使えそうだと見込んだawait / asyncを試しています。 しかし、これが含まれていると思われる「非同期処理」の説明は全体的に理解されませんでしたから、ほとんどコードをテストすることによってしか理解を試みられていないようなものです。 このために、書き方や処理への理解に気がかりが残っています。awaitに割り当てた関数に条件分岐を作成し、必要な場合を除いてPromiseの一つ目の引数(?)が返されないようにすると、現段階で期待した範囲の動きは確認できました*。このような書き方で明らかに問題の発生が想定される場合(今存在する以上のコード提示が必要な問題は除きます)、または(非同期処理に関係する)他の何かを使用して同じ処理の書き換えが可能な場合は、次に調査するべき具体的なキーワードあるいは説明や例をいただけないですか。

js

1function test(tf) { 2return new Promise((x,y) => {if(tf){return x(tf)};return y('falsy');}) 3} 4async function call() {console.log(await test(tf));} 5//tfにtruthy判定される値を入れた場合はx, falsy判定される値を入れた場合はyが返されるようにしています。これは動作確認の為の一例ですから、深く考えないでください。 6//*この動きとはたとえば次のようなものです:tfに1を入れるとconsole.log()は1を表示し、0を入れた場合は開発ツールで「Uncaught (in promise) falsy」を確認できます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2021/09/11 07:36

読みにくい から 改行 を しよう。
guest

回答1

0

自己解決

Promise コンストラクターの引数の呼び方が不確かなので、質問に従ってxyを使用します。Promise オブジェクト(p)に対して使えるメソッドにthen()とcatch()があります。then()は引数が1つなら、単純にxが返されたときに実行されるようです*。x => x(5)ならば'then!'を確認しますが、x => 5では確認できません。

js

1p.then(() => console.log('then!'));

catch()は返された値を取得できない場合か、yが返されたときに機能するようです。() => ok(未作成変数)や() => x(5)あるいは(x,y) => y('five')ならば'catch!'を確認しますが、 では確認できません。

js

1p.then(() => console.log('then!') 2).catch(() => console.log('catch!'))

(引数が1つの)then()はx、catch()はyに入れた値を引数の引数として使用できるようです。

js

1//念の為の確認 2const p = new Promise((x,y) => {if(tf){x(5)}else{y('five')}}); 3p.then(num => console.log(num,typeof num)//number 4).catch(str => console.log(str, typeof str));//string

await expressionは、expressionがPromise オブジェクトかつxが返されたときにはxに入れた値になるようです(つまりtypeof await test(1)numberを返します)。
エラーメッセージの表示自体はconsole.errorで再現されたため、それも用いて単に同じように見える処理を書くことを今試みるならば、次のようになるでしょう。

js

1function test(tf) { 2const p = new Promise((x,y) => {if(tf){return x(tf)};return y('falsy');}); 3p.then(value => console.log(value) 4).catch(reason => console.error(`Uncaught (in promise) ${reason}`)); 5} 6async function call() {await test(tf);}

質問コードはawait / asyncをまだ実質的には使用していないと言える状態だと思われるため、これらの方法がawait / asyncという方法のうえで適切かどうかには言及できません。
*then()は2つ目の引数を使用するとcatch()と同等に見える処理が行えました。しかし、これらの使い分けについては調べていません。

js

1p.then(value => console.log(value) 2, reason => console.error(`Uncaught (in promise) ${reason}`)

一定期間のうちに内容への指摘が確認できなかったため、ここまでの自己進展を回答として一旦締め切ります。

投稿2021/09/14 06:24

3_April_2021

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問