비동기적
으로 실행된다.const resolvedProm = Promise.resolve(33);
let thenProm = resolvedProm.then(value => {
console.log("이 부분은 호출 스택 이후에 실행됩니다. 전달받은 값이자 반환값은 " + value + "입니다.");
return value;
});
// thenProm의 값을 즉시 기록
console.log(thenProm);
// setTimeout으로 함수 실행을 호출 스택이 빌 때까지 미룰 수 있음
setTimeout(() => {
console.log(thenProm);
});
// 로그 출력 결과 (순서대로):
// Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
// "이 부분은 호출 스택 이후에 실행됩니다. 전달받은 값이자 반환값은 33입니다."
// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: 33}
Promise.resolve(<핸들러에서 반환한 값>)
을 반환하는 것과 같다. ->promise를 반환하는거고 resolve가 실행되지 않은 상태를 말한다. Promise.resolve('foo')
// 1. "foo"를 받고 "bar"를 추가한 다음 그 값으로 이행하여 다음 then에 넘겨줌
.then(function(string) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
string += 'bar';
resolve(string);
}, 1);
});
})
// 2. "foobar"를 받고 그대로 다음 then에 넘겨준 뒤,
// 나중에 콜백 함수에서 가공하고 콘솔에 출력
.then(function(string) {
setTimeout(function() {
string += 'baz';
console.log(string);
}, 1)
return string;
})
// 3. 이 부분의 코드는 이전의 then 블록 안의 (가짜) 비동기 코드에서
// 실제로 문자열을 가공하기 전에 실행됨
.then(function(string) {
console.log("마지막 Then: 출력 순서가 이상함");
// 'baz' 부분은 setTimeout 함수로 비동기적으로 실행되기 때문에
// 이곳의 string에는 아직 'baz' 부분이 없음
console.log(string);
});
// 로그 출력 결과
// 마지막 Then: 출력 순서가 이상함
// foobar
// foobarbaz
Promise.resolve('foo')
.then(function(string) {
console.log("hi1")
return new Promise(function(resolve, reject) {
setTimeout(function() {
string += 'bar';
resolve(string);
}, 1);
});
})
.then(function(string) {
console.log("hi2")
return new Promise(function(resolve, reject){
//또다른 비동기흐름을 생성
setTimeout(function() {
string += 'baz';
console.log(string);
resolve(string)
}, 1)
})
})
.then(function(string) {
console.log("마지막 Then: 순서는 차례대로 나온다.");
console.log(string);
});
console.log("hi3")
// 로그 출력 결과 :
//hi3
//hi1
//Promise {<pending>}
//hi2
//foobarbaz
//마지막 Then: 순서는 차례대로 나온다.
//foobarbaz
let myFirstPromise = new Promise((resolve, reject) => {
// 이 예제에서는 setTimeout()을 사용해 비동기 코드를 흉내냅니다.
// 실제로는 여기서 XHR이나 HTML5 API를 사용할 것입니다.
setTimeout( function() {
resolve("성공!") // 와! 문제 없음!
}, 250)
})
myFirstPromise.then((successMessage) => {
console.log("와! " + successMessage)
});
console.log(myFirstPromise)
결과 :
Promise {<pending>}
와! 성공!
let myFirstPromise = new Promise((resolve, reject) => {
resolve("성공!") // 와! 문제 없음!
})
myFirstPromise.then((successMessage) => {
console.log("와! " + successMessage)
});
console.log(myFirstPromise);
// 결과 :
Promise {<fulfilled>: '성공!'}
와! 성공!
promise리턴시 Then을 만났을 때 해당 콜백함수가 실행이 되고. then의 콜백함수는 promise의 콜백함수에서 resolve가 실행이 되고 실행된다. then의 콜백함수는 비동기로 실행되지만 then다음의 then은
Promise를 리턴받을때 까지 기다린다. 따라서 앞의 then의 콜백함수의 return을 받고 뒤의 then의 콜백함수가 실행된다.
Pomise에 then을 만나면 기존스레드는 진행하고 새로운 쓰레드를만들고 그뒤 then은 Promise를 줄때까지 대기.
Promise를 return하든 값을 return하든 똑같음.