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

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

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

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

Q&A

解決済

3回答

768閲覧

Javascript - Promise を async/awaitに書き換えたい

weekend_lover

総合スコア2

JavaScript

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

0グッド

0クリップ

投稿2021/03/31 17:27

Javascriptの非同期処理を勉強しています。分からないことがありますので教えていただきたく、書き込ませていただきます。

<script> function fnc1(arg) { console.log(arg); } function fnc2(arg) { console.log(arg); } // ここをasync functionに書き換えたい pm = (arg1) => { return new Promise(resolve => { setTimeout(() => { fnc1(arg1); resolve(); }, 3000); }) } (async () => { await pm("fnc1 called"); setTimeout(() => { fnc2("fnc2 called"); }, 2000) })(); </script>

上記コードは、実行してから3秒後にfnc1を呼び、そのさらに2秒後にfnc2を呼ぶというシンプルなコードですが、JSの勉強を兼ねて、このコードをPromiseを一切使わずに、Promiseのシンタックスシュガーであるasync/awaitだけで実装しようとしております。
async functionを使うと、returnした値を引数にpromiseをresolveしてくれるはずなので、現コードでPromiseを返しているpmを、async functionで書き換えようとしているのですが、色々試行錯誤してもうまくいきません。
例えば下記のように書いても、setTimeoutの実行を待たずにasync function自体が先に終了してしまうため、fnc2が先に呼ばれてしまいます。(setTimeoutを呼んでも単にコールバックをキューに入れるだけで呼び出し元関数の処理がそこでストップするわけではないため、呼び出し元関数の処理が終わったタイミングでresolveされてしまっているからだと理解しています。)

async function pm(arg1) { setTimeout(() => { fnc1(arg1); return; }, 3000); }

どのようにすれば、「Promise」というキーワードを一切使わずにasync/awaitだけで上記の挙動を再現できるのでしょうか。
お知恵を拝借できますと幸甚です。

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

「Promise」というキーワードを一切使わずにasync/awaitだけで上記の挙動を再現できるのでしょうか。

不可能です。async/await は Promise を返す関数のための機能です。
あらかじめPromiseを返す関数が用意されていてそれを使うだけならば新たにPromiseを作る必要はないのですが、この場合、setTimeout()に相当するPromiseはどうしても必要です。

投稿2021/03/31 17:40

int32_t

総合スコア21695

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

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

0

トンチ的回答(実質的に役に立つものではない)ではありますが、「Promise」というキーワードを使うことは回避できます。

javascript

1pm = (arg1) => { 2 return new window['Pr' + 'omise'](resolve => { 3 setTimeout(() => { 4 fnc1(arg1); 5 resolve(); 6 }, 3000); 7 }) 8}

投稿2021/06/16 23:14

maisumakun

総合スコア146018

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

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

0

ベストアンサー

Promiseの中でコールバックを利用しつつ戻り値がないsetTimeoutのような処理は
Promiseのリゾルバが実行されないため終了が通知されません
無理やりやれば近いことは出来ないことはないですが、それをスマートにやるのが
Promiseです

投稿2021/04/01 00:14

yambejp

総合スコア116720

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

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

weekend_lover

2021/04/01 16:40

ご回答ありがとうございました。リゾルバが実行されないとのこと、大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問