Promise로 비동기 처리 연결하기
비동기 처리 여러 개를 연결해서 순차적으로 실행하려면 성공 콜백 함수가 Promise 객체를 반환하도록 만듭니다.
function buyAsync(myMoney){
return new Promise(function(resolve,reject) {
setTimeout(function() {
var payment = parseInt(prompt(`지불할 금액을 입력하십시오`))
var balance = myMoney - payment
if(balance > 0){
console.log(`${payment}원를 지불하였습니다.`)
resolve(balance)
}
else{
reject(`잔액은 ${balance}원입니다. 구매할 수 없습니다.`)
}
},1000)
})
}
buyAsync(500)
.then(function(balance){
console.log(`잔액은 ${balance}원입니다.`)
return buyAsync(balance)
})
.then(function(balance) {
console.log(`잔액은 ${balance}원입니다.`)
return buyAsync(balance)
})
.then(function(balance){
console.log(`잔액은 ${balance}원입니다.`)
return buyAsync(balance)
})
.catch(function(error) {
console.log(error)
})
위 코드의 실행결과를 보면
100원을 지불했습니다.
잔액은 400원입니다.
100원을 지불했습니다.
잔액은 300원입니다.
100원을 지불했습니다.
잔액은 200원입니다.
비동기 처리 여러 개를 병렬로 실행하기
Promise.all 메서드를 이용하면 비동기 처리 여러 개를 병렬로 실행할 수 있습니다.
function buyAsync(name,myMoney){
return new Promise(function(resolve,reject) {
setTimeout(function() {
var payment = parseInt(prompt(`${name}님, 지불할 금액을 입력하십시오`))
var balance = myMoney - payment
if(balance > 0){
console.log(`${name}:${payment}원를 지불하였습니다.`)
resolve(balance)
}
else{
reject(`${name}:잔액은 ${balance}원입니다. 구매할 수 없습니다.`)
}
},1000)
})
}
Promise.all([
buyAsync("Tom",500),
buyAsync("Huck",600),
buyAsync("Becky",1000)
])
.then(function(balance){
console.log(balance)
})
.catch(function(error) {
console.log(error)
})