티스토리 뷰

Javascript

Promise 이해하기

뮹뭉묵목몽묭 2019. 7. 20. 22:35

Promise 객체는 세가지의 상태 값을 가집니다.

 

대기중(pending) : 아직 결과가 없는 상태입니다. 약속을 했지만 아직 약속에 대한 결과가 나오지 않은 상태이다.

 

이행됨(Fulfilled) : 비동기 처리가 성공적으로 완료되어 약속을 이행한 상태입니다. 이때 결과로 하나의 값이 전달됩니다.

 

거부됨(rejected) : 비동기 처리가 실패한 상태입니다. 약속이 거부되고 그 결과로 거절된 이유를 전달합니다.

 

Promise 객체는 두가지 메소드를 가집니다.

 

then(onFulfilled, onReject) : 약속이 완료됐을 때 호출될 함수들을 정의합니다. 이때 첫번째 인자로 전달되는 함수는 약속이 성공적으로 이행됐을때 호출되고 두 번째 인자로 전달된 함수는 거부됐을 때 호출됩니다. 두 전달 인자 함수들을 매개변수를 가지는데 각각의 결과가 매개변수를 통해 전달됩니다.

 

catch(onReject) : 약속이 거부됐을때 호출될 함수를 등록합니다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function promiseForHomework(mustDo) {
    return new Promise ((resolve, reject) => {
        setTimeout(() => {
            console.log('doing homework');
            if(mustDo) {
                resolve ({
                    result : "homework-result"
                });
            } else {
                reject(new Error('too Lazy'));
            }
        }, 3000);
    });
}
 
const promiseA = promiseForHomework(true);
console.log('promiseA created');
const promiseB = promiseForHomework();
console.log('promiseB created');
 
promiseA.then(v => console.log(v));
 
promiseB
.then(v => console.log(v))
.then(e => console.log(e));
cs

 

숙제에 대한 promise 객체를 생성하는 함수를 정의합니다. 이때 매개 변수로 mustDo를 정의하고 이에 의해 Promise에 대한 성공과 실패를 결정합니다.

Promise 객체는 Promise 생성자 함수에 new 키워드를 통해 생성할수 있습니다. 이때 계산될 코드를 담은 함수를 인자로 전달하는데 이 함수느에는 resolve와 reject 매개변수를 가집니다.

resolve는 약속을 성공시킬수 있는 함수로 호출시 결과를 인자로 전달함, reject는 실패 처리르 위한 함수로 호출시 실패 이유를 전달함. setTImeout 함수를 통해 3초 후에 실행될 코드를 정의함. 콘솔에 'doing homework'을 출력하는 코드는 3초 후에 실행되고, 전달받은 인자값에 따라 resolve나 reject 함수가 호출됨. 이후에 then 메소드에 메소드에 전달된 첫번재 인자의 함수가 호출되고, 이때 resolve 전달한 전달 인자가 then 메소드의 전달된 함수의 매개변수로 전달됩니다.

각 Promise 객체에 resolve 와 reject 되었을 경우 호출될 함수들을 정의합니다. promiseA 객체는 resolve가 되어 "[result:'homework-result"]"가 콘솔에 출력되고, promiseB 객체는 reject가 되서 전달한 함수는 호출이 안되고 catch 메소드에 전달한 함수가 호출되어 거절된 에러를 출력도비니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function doJob (name, person) {
return new Promise ((resolve, reject) => {
setTimeout(() => {
if(person.stamina>50) {
    resolve ({
        result : `${name} success`,
        loss : 30
    });
else {
    reject(new Error(`${name} failed`));
}
}, 1000);
});
}
 
const John = {stamina:100};
 
doJob('work', John)
.then( v => {
    console.log(v.result);
    John.stamina -=v.loss;
    return doJob('study', John);
})
.then( v => {
    console.log(v.result);
    John.stamina -=v.loss;
    return doJob('work', John);
})
.then( v => {
    console.log(v.result);
    John.stamina -=v.loss;
    return doJob('study', John);
})
.catch (e => {
console.error(e);
});
cs

 

하나의 비동기 계산이 다른 비동기 계싼의 결과에 의해 처리되어야 하는 경우가 많다.

위 예제는 1초 후에 주어진 이름의 일을 수행하여 이행 시 스테미나를 차감할 값을 반환합니다. 1초 후에 일을 수행하는 약속을 연속적으로 처리하게 됩니다.

 

async 함수를 사용해서 비동기 작업들을 제어하는 방법도 있다. await  키워드는 반드시 async 함수안에서만 유효하다.

async 함수를 선언하는 방법에는 async 함수 선언문(async function) 과 표현식 (async function expression)이 있습니다.

async 함수는 function 선언 앞에 async 키워드가 붙습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function doJob (name, person) {
return new Promise ((resolve, reject) => {
setTimeout(() => {
if(person.stamina>50) {
    person.stamina-=30;
    resolve ({
        result : `${name} success`,
        
    });
else {
    reject(new Error(`${name} failed`));
}
}, 1000);
});
}
 
const John = {stamina:100};
 
const execute = async function () {
    try {
let v = await doJob('work', John);
console.log(v.result);
= await doJob('study', John);
console.log(v.result);
 v = await doJob('work', John);
console.log(v.result);
 
    } catch (e) {
        console.error(e);
    }
}
 
execute();
cs

'Javascript' 카테고리의 다른 글

DOM 이벤트 처리  (0) 2019.07.24
DOM 이해하기  (0) 2019.07.22
setInterval에 관하여  (0) 2019.07.20
SetTimeout에 관하여  (0) 2019.07.20
반복 가능한 규약(Iterable Protocol)과 반복자 규약(Iterator protocol)  (0) 2019.07.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함