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だけで上記の挙動を再現できるのでしょうか。
お知恵を拝借できますと幸甚です。
よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。