非同期処理


非同期関数とは?JavaScriptはシングルスレッドなので、一度に1つのタスクしか実行できません.この問題を解決するために、非同期が発生した.非同期とは、特定のコードの処理が完了する前に、次のコードを実行できます.
console.log('1')
setTimeout(()=> console.log('2'), 1000) // 나중에(1초) 불러주는 callback함수
console.log('3')
コールバックは常に非同期にのみ使用されますか?
ダイヤルバックも2種類ございます
インスタント同期のための同期コールバック
  • function printImmediately(print){ //print라는 콜백을 받는다
    	print()
    }
    
    printImmediately(()=> console.log('hello'))
    Asynchronous callback
  • はいつ実行するか分かりません
    function printWithDelay(print, timeout){
    	setTimeout(print, timeout);
    }
    
    printWithDelay(()=>console.log('aysnc callback'), 2000)
    >>  console.log('aysnc callback')이 2초뒤 실행
    すべての関数の宣言がハイライトされます.
    function printWithDelay(print, timeout){
    setTimeout(print, timeout);
    }
    関数宣言は実は一番上です!
    await
    
    function delay(ms) {
    	return new Promise(resolve => setTimeout(resolve, ms))
    }
    
    async fuction getApple() {
    	await delay(3000) // 3초뒤에 apple 반환
    	return 'apple'
    }
    
    async fuction banana() {
    	await delay(3000) // 3초뒤에 banana 반환
    	return 'banana'
    }
    // 콜백지옥의 향기가 솔솔난다
    function pickFruit(){
    	return getApple()
        .then(apple => {
        	return getBanana()
            .then(banana => `${apple} + ${banana}`)
        })
    }
    
    pickFruit().then(console.log)
    async、awaitを使用して簡略化
    このように逐次漸進して、3+3になって、効率がありません
    async function pickFruit(){
    
    	try {
       	 	const apple = await getApple()
    		const banana = await getBanana()
        } catch(){ //에러처리
        	console.log(error)
        }
        return `${apple} + ${banana}`
    }
    
    効率化:並列処理待ち
    async function pickFruit(){
    		const applePromise = getApple() //콜백끼리 서로 관계가 없을경우 가능
            const bananaPromise = getBanana()
       	 	const apple = await applePromise()
    		const banana = await bananaPromise()
       
        return `${apple} + ${banana}`
    }
    
    上のコードをもっと簡潔にします
    function pickAllFruits () {
    	return Promise.all([getApple(), getBanana()])
        .then(fruit => fruit.join(' + '))
    }
    
    pickAllFruit().then(console.log) 
    // apple + banana 출력  
    最初に実行した値を取得したい場合は?
    遅延が異なると仮定してapple-1秒/バナナ2秒
    function pickOnlyOne() {
    	return Promise.race([getApple, getBanana])
    }
    
    pickOnlyOne().then(console.log)
    // apple만 출력된다