본문 바로가기

Node.js

비동기 : async/await

1. async/await

- Promise then을 한 번 더 축약한 것

- Promise 지옥에서 벗어날 수 있다.

- Promise는 왼쪽에서 오른쪽으로 읽지만,

  async/await은 오른쪽에서 왼쪽으로 읽어줘야한다. 

//promise 함수
function findAndSaveUser(Users){
	Users.findOne({})    //Users에서 객체 하나를 반환해라.
    .then((user) => {    //성공하면 user에 {name: 'zero} 를 넣어라.
    	user.name = 'zero'
        return user.save()  //프로퍼티를 추가한 user를 저장해라.
    })
    .then((user) => {      //결과값으로 받아온 user를 이용해
    	return Users.findOne({ gender: 'm' })   //Users에서 조건에 맞는 객체 하나를 반환해라.
    })
    .then((user) => {
    	....
    })
}

- await은 promise의 then의 역할을 해준다.

//async/await

async function findAndSaveUser(Users){
	let user = await Users.findOne({})   //Users에서 객체 하나를 반환했다면 user에 넣어라.
    user.name = 'zero'     //user에 {name: 'zero'} 프로퍼티를 넣어라.
    user = await user.save()   //user를 저장했다면 user에 넣어라.
    user = await Users.findOne({gender: 'm'})  //Users에서 조건에 맞는 객체 하나를 찾았다면 user에 넣어라.
    ...
}

- user : 결과값

- await : then

- Users.findOne({ }) : 프로미스

 => Users.findOne({ })을 실행해서 await한다면 user에 결과값을 넣어라.

2. 요즘은 async 함수 없이 await만 사용해서 쓸 수 있다.

 

3. async에서 return한 결과값을 then으로 받아야한다.

async function main(){
	const result = await promise
    return 'zerocho'
}
main().then((name)=> ~~~)
const name = await main()

4. try/catch

- async/await에서 reject를 처리하려면 try/catch구문으로 감싸줘야 한다.

async function main(){
	try{         
    	const result = await promise  //promise를 실행하여 성공하면 result에 값을 넣어라.
        return result
    } catch(error){  //에러가 난다면 에러를 출력해라.
    	console.error(error)
    }
}

5. promise 반복문

const promise1 = promise.resolve('성공1')
const promise2 = promise.resolve('성공2')
(async ( ) => {
	for await(promise of [promise1, promise2]){  //promise로 배열을 만든 후 각 프로미스를 순환하면서 성공했다면
    	console.log(promise)    //성공한 프로미스의 콘솔로그를 실행해라.
    }
})( )  //()()함수는 즉시 실행 함수이다.
728x90

'Node.js' 카테고리의 다른 글

널병합 연산자 / 옵셔널 체이닝  (0) 2023.06.29
<Map / Set>  (0) 2023.06.29
비동기 : Promise  (0) 2023.06.28
class  (0) 2023.06.28
구조분해할당  (0) 2023.06.28