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

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

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

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

Q&A

解決済

2回答

1431閲覧

promiseをasyncに書き換える方法

Sonono

総合スコア85

JavaScript

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

1グッド

0クリップ

投稿2022/03/06 00:05

編集2022/03/06 00:05

勉強のため、promiseをasyncに書き換えようとしたのですが、うまく行きません。
asyncはreturnをするときにresolveを返すと思っているのですが、コード2を実行すると2秒を待たずすぐにundefinedが返ってきてしいます。なぜでしょうか?

コード1

function sampleResolve(value) { return new Promise(resolve => { setTimeout(() => { resolve(value); }, 2000); }) } sampleResolve(5).then((value) => { console.log(value) }) // -> 5

コード2

async function sampleResolve(value) { setTimeout(() => { return(value); }, 2000); } sampleResolve(5).then((value) => { console.log(value) }) // -> undefined
shiracamus👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

コード2は以下のように書いたのと同等です。
sampleResolve関数自体では何も return していないので、関数の復帰値は undefined をresolveしたPromiseになり、sampleResolve呼出しをawaitすると即復帰して undefined が返ります。
sampleResolve関数からPromiseを返すと、await時にそのPromiseのresolvかrejectが呼ばれるまで待ってくれます。

js

1async function sampleResolve(value) { 2 const callback = () => { 3 return value; 4 } 5 setTimeout(callback, 2000); 6} 7 8(async function() { 9 console.log('return:', await sampleResolve("Hello")); 10})();

以下のようにsetTimeoutをPromiseで包んでawaitすれば、sampleResolve関数からはpending状態(await中)のPromiseが返ります。
setTimeoutが2秒後にresolveを呼ぶことにより sampleResolve関数内の await が終わり、return "Hello" によってsampleResolve関数が返した Promise の resolve("Hello") が呼ばれて resolve状態になり、外部のawaitが終わって"Hello"が返り、開始から2秒後に return: Hello が表示されます。

js

1async function sampleResolve(value) { 2 await new Promise(resolve => setTimeout(resolve, 2000)); 3 return value; 4} 5 6(async function() { 7 console.log('return:', await sampleResolve("Hello")); 8})();

投稿2022/03/06 02:24

編集2022/03/06 04:51
shiracamus

総合スコア5406

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

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

Sonono

2022/03/06 03:30

お二方とも、ありがとうございました。とても勉強になりました。 「sampleResolve関数自体では何も return していないので、関数の復帰値は undefined をresolveしたPromiseになる」ということが納得できました!
Sonono

2022/03/06 04:09

すみません、本筋と関係ないところですが一つ質問があります。 ```await new Promise(resolve => setTimeout(resolve, 2000));``` は以下のコードと同様だと思いますが、なぜresolveにカッコが要らないんでしょうか? カッコなしのresolveだとただのオブジェクトなので、何も起きない(resolveされない)ように感じてしまいます。 (下のコードではカッコがないとうまく動きません。) ``` await new Promise((resolve) => { setTimeout(() => { resolve(); }, 2000) }); ```
shiracamus

2022/03/06 04:32 編集

コメントした最初のコードで示したように、setTime関数の引数には関数を指定します。 関数名を書くか関数定義を書きます。どちらも関数オブジェクトです。 () => { resolve(); } は関数を定義しただけで関数は呼び出していません。単に resolve と書いたのと同じことになります。
Sonono

2022/03/06 04:29

理解しました。ありがとうございます!!
shiracamus

2022/03/06 04:31 編集

function resolve() { console.log("called resolve"); } function timeout(callback) { callback(); } timeout(resolve); timeout(() => { resolve(); });
guest

0

勉強のため、promiseをasyncに書き換えようとしたのですが、うまく行きません。

このコードについては、Promiseを使わずに書くことはできません。

setTimeoutはコールバックを取る非同期関数で、Promiseとは縁がないので、自分でPromiseを作らなければ、async-awaitともタイミングを合わせることができません(async-awaitPromiseの書き方を変えたものです)。

投稿2022/03/06 00:14

maisumakun

総合スコア145183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問