🏖️
【JavaScript】技術面接を振り返る。〜非同期処理の順番問題〜
背景
とある会社の技術面接の際に、非同期処理の処理順の理解度を確かめる問題があった。
そこで改めて出題された問題を思い出しながら、非同期処理の順序を復習してみました。
出題された問題
※ソースコードは正確には記憶していないので、思い出せる限りで記述します。
問題:以下のコードを実行した際に、出力されるアルファベット順を答えなさい。
async function func1 (){
console.log("a")
const hoge = await new Promise((resolve) => {
resolve("")
}).then(() =>
console.log("b")
)
}
function func2 (){
new Promise((resolve) =>{
console.log("c")
setTimeout(() => {
console.log("d")
resolve(1)
},0)
}).then(async() => {
console.log("e")
const fuga = await func1()
}
)
console.log("f")
}
console.log("g")
func2()
console.log("h")
解説
- まずは
g
が出力される。(それまでの関数は定義されているだけで実行されていない。) - その後func2が実行される。
- func2内のPromise生成時にコンストラクターに渡した関数は、同期的に実行される。 故に、
c
が出力される。 - setTimeoutが実行される。ここでは0msで設定されているが秒数に関わらず、引数の関数の処理がタスクキューに追加される。
-
f
が出力され、同期処理が続行されh
が出力される。 - タスクキューに格納されていた処理が実行され
d
が出力され、Promiseが成功する。 -
e
が出力され、その後func1が実行され、a
が出力される。 - awaitでPromiseの返却を待機しているので、
b
が出力されて終了する。
解答
g -> c -> f -> h -> d -> e -> a -> b
おわりに
出題されたときは初見でぎょっとしてしまいましたが、改めて基礎力を試されているなと感じました。非同期処理はこれ以外にも奥深い世界なのでもっと精進します🔥
なにか記事に間違いがあればご指摘ください。
参考記事:
とても参考になる記事でした!ありがとうございます!
何問分かる?Promise に関するクイズ13問【解説付き】
タスクキューとマイクロタスクキュー
Discussion
Promise.thenにあるcbはMicrotaskにいれてます
setTimeoutにあるcbはmacrotaskにいられています
それ以外には一般taskキューにいられています。
一般taskキューにあるすべてなタスク --> microtaskキューにあるすべてのタスク --> Macrotaskキューにある一つのタスク --> 一般taskキューにあるすべてなタスク
のように循環でevent loopされてます
補足のご説明ありがとうございます!
イベントループの理解が深まりました!