December 12th, 2020
そもそも同期とは、コンピュータ関係ではプロセスなどといった複数のエージェントの動作について、時系列的にタイミングを合わせる制御
Rubyなら上から順番に実行されていきます。 なのでターミナルで順番に表示されました。
# アホになる関数
def wait_three_second(num)
sleep(3) # 3秒待ってくれます。
"🤪 #{num} !"
end
puts 1
puts 2
puts wait_three_second(3)
puts 4
puts 5
puts wait_three_second(6)
puts 7
puts 8
puts wait_three_second(9)
puts 10
1
2
🤪 3 !
4
5
🤪 6 !
7
8
🤪 9 !
10
JSは同期的ではなくて、非同期的な処理をします。 即座に全ての関数が実行されて、3秒後に 3, 6, 9が表示されます。
function waitThreeSecond(num) {
setTimeout(
function() { console.log(`🤪 ${num}`); },
'3000'
);
}
console.log('1');
console.log('2');
waitThreeSecond('3');
console.log('4');
console.log('5');
waitThreeSecond('6');
console.log('7');
console.log('8');
waitThreeSecond('9');
console.log('10');
1
2
4
5
7
8
10
🤪 3
🤪 6
🤪 9
これがJSの非同期的(asynchronous)な処理です。
関数を上から全て実行している点はRubyの同期的な処理と同じですが、 関数の出力結果を待たずに、次の関数が実行されているのがポイントです。
Promise(今回はasync/await構文を使ってみた)で実現できます。
function stopThreeSecond(num) {
return new Promise((resolve, reject) => {
setTimeout(
() => resolve(console.log(`🤪${num}`)),
3000
)
})
}
async function showNubmers() {
console.log('1')
console.log('2')
await stopThreeSecond('3')
console.log('4')
console.log('5')
await stopThreeSecond('6')
console.log('7')
console.log('8')
await stopThreeSecond('9')
console.log('10')
}
showNubmers()
1
2
🤪3
4
5
🤪6
7
8
🤪9
10
Photo by Aral Tasher on Unsplash