JAVASCRIPT PROMISES
in
ECMAScript6 (Harmony)
01 02 03 04
Promise란
무엇인가?
Promise
사용하기
Promise의
특징
Promise 직접
구현하기
전통적인 콜백 패
턴이 가지고 있는
문제와 Promise 정
의및 사용 방법에
대해서 개괄적으로
살펴본다.
Promise의 정적 메
서드와 인스턴스
메 서 드 , 그 리 고
thenable에 관한
개념 등 조금 더 다
양하고 자세한 내
용을 살펴본다.
Promise에 대해
잘 알려져 있지 않
는 중요한 특징 몇
가지를 소개한다.
ES6
  Promises의
 
 
베 이 스 가
  되 는
 
 
Promise/A+의
 사
 
양을
  직접
  구현해
 
봄 으 로 써
 
 
Promise에
  대한
 
 
이해를
  더욱
  높인
 
다.
 
2	
  
전통적인 콜백 패턴의 문제 1
여러운 비동기 예외 처리
3	
  
try{

setTimeout(function(){

throw new Error('에러가 발생했다.');

}, 1000);

}catch(err){

console.error(err);

console.log('에러를 복구했다.');

}
전통적인 콜백 패턴의 문제 1
여러운 비동기 예외 처리
try{

setTimeout(function(){

throw new Error('에러가 발생했다.');

}, 1000);

}catch(err){

console.error(err);

console.log('에러를 복구했다.');

}	
 
global
4	
  
전통적인 콜백 패턴의 문제 1
여러운 비동기 예외 처리
try{

setTimeout(function(){

throw new Error('에러가 발생했다.');

}, 1000);

}catch(err){

console.error(err);

console.log('에러를 복구했다.');

}	
 
global setTimeout() handler
호출
콜백 등록
5	
  
전통적인 콜백 패턴의 문제 1
여러운 비동기 예외 처리
try{

setTimeout(function(){

throw new Error('에러가 발생했다.');

}, 1000);

}catch(err){

console.error(err);

console.log('에러를 복구했다.');

}	
 
global time eventsetTimeout() handler
호출
콜백 등록
발화
6	
  
전통적인 콜백 패턴의 문제 1
여러운 비동기 예외 처리
try{

setTimeout(function(){

throw new Error('에러가 발생했다.');

}, 1000);

}catch(err){

console.error(err);

console.log('에러를 복구했다.');

}	
 
global time eventsetTimeout() handler
호출
콜백 등록
발화
예외
7	
  
전통적인 콜백 패턴의 문제 1
여러운 비동기 예외 처리
try{

setTimeout(function(){

throw new Error('에러가 발생했다.');

}, 1000);

}catch(err){

console.error(err);

console.log('에러를 복구했다.');

}	
 
global time eventsetTimeout() handler
호출
콜백 등록
발화
예외 통지예외
8	
  
전통적인 콜백 패턴의 문제 2
복수의 비동기 처리
fs.readdir(source, function(err, files){

if(err){

console.log('Error finding files : ' + err);

}else{

file.forEach(function(filename, fileIndex){

console.log(filename);

gm(source + filename).size(function(err, vlaues){

if(err){

console.log('Error identifying file size : ' + err);

}else{

console.log(filename + ' : ' + values);

aspect = (values.width / value.height);

widths.forEach(function(width, wwidthIndex){

height = Math.round(width /aspect);

console.log('resizing ' + filename + 'to ' + height + 'x' + height);

this.resize(width, height).write(
destination + 'w' + width + '_' + filename,
function(err){

if(err){

console.log('Error writing file : ' + err);

}

}
);

});

}

});

});

}

})	
 
9	
  
Promise란?
정의
Promise란 비동기 처리 로직을 추상화한 객체와 그것을 조작하는 방식을 말한다.
E 언어에서 처음 고안됐으며 병렬 및 병행 프로그래밍을 위한 일종의 디자인이다.
비동기
 로직
 
전달	
  
Promise	
  
인
터
페
이
스
 
의존	
  구현	
  
액터	
  
10	
  
Promise란?
효과
전통적인 콜백 패턴이 가진 단점을 일부 보완한다.
비동기 처리 시점을 명확하게 표현한다.
Promise 객체의 인터페이스를 이용해 다양한 비동기 처리를 패턴화할 수 있다.
복잡하고 불편한 비동기 예외 처리를 손쉽게 다룰 수 있다.
11	
  
Promise란?
명세
초기 작업
ES6 DRAFT
Promises/A+
https://github.com/domenic/promises-unwrapping
https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-constructor
Promises/A+
 :
 https://promisesaplus.com/
 
12	
  
Promise란?
사용된 곳
if('serviceWorker' in navigator){

navigator.serviceWorker.register('/sw=text/sw.js', {

scope: '/'

}).then(function(sw){

// registration worked

console.log('Registration succeeded.');

}).catch(function(err){

// registration filed

console.log('Registration filed with ' + err);

})

}	
  	
 
function writeArrayToStream(array, writableStream){

array.forEach(chunk =  writableStream.write(chunk));

return writableStream.close();

}



writeArrayToStream([1, 2, 3, 4, 5], writableStream)

.then(() = console.log('All done!'))

.catch(e = console.log('Error with the stream : ' + e));	
 
Service Worker API
Streams API
13	
  
Promise 살펴보기
Promises API
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
strawman(폐기)
 :
 http://wiki.ecmascript.org/doku.php?id=strawman:promises
 
Constructor
var promise = new Promise(function(resolve, reject){

// 비동기 처리 작성
// 처리가 끝나면 resolve 또는 reject 호출
});	
   	
 
Instace Method Static Method
Promise.prototype.then(onFulfilled,
 onRejected)
 
Promise.prototype.catch(onRejected)
 
Promise.all()
 
Promise.race()
 
Promise.resolve()
 
Promise.reject()
 
14	
  
Promise 살펴보기
워크플로우
/**

* @returns {Promise}

*/

function asyncFunction(){

return new Promise(function(resolve, reject){

setTimeout(function(){

resolve('Async Hello world!!');

}, 16);

})

}	
   	
 
asyncFunction().then(function(value){

console.log(value);

}).catch(function(error){

console.log(error);

});	
   	
 
asyncFunction().then(function(value){

console.log(value);

}, function(error){

console.log(error);

});	
   	
 
asyncFunction()은 Promise의 인스턴스를
반환할 뿐이며 비동기 로직은 모두
Promise에 추상화된다.
비동기 처리가 성공했을 때 호출될 콜백은
then(), 실패했을 때 호출될 콜백은
catch()로 등록한다.
catch()는 then()을 이용해 대체할 수도
있다.
15	
  
Promise 살펴보기
상태
초기 상태
성공(또는 해결) 상태
실패(또는 거부) 상태
불편 상태
unresolved
 또는
 Pending,
 
 
성공도
 실패도
 아닌
 초기
 상태
 
has-resolution
 또는
 Fulfilled,
 
 
성공(resolve)했을
 때의
 상태
 
has-rejection
 또는
 Rejected,
 
 
실패(reject)했을
 때의
 상태
 
Settled,
 성공
 또는
 실패
 했을
 때의
 상태.
 
Fulfilled
Rejected
Pending
16	
  
Promise 맛보기
객체 생성
1.  new Promise(fn)으로 promise 객체를 생성한다.
2.  fn에는 비동기 처리를 작성한다.
•  처리 결과가 정상이라면 resolve(결과 값)을 호출한다.
•  처리 결과가 비정상이라면 reject(error)을 호출한다.
function getJSON(URL){

return new Promise(function(resolve, reject){

var req = new XMLHttpRequest();



req.open('GET', URL, true);

req.onload = function(){

if(req.status === 200){

resolve(JSON.parse(req.responseText));

}else{

reject(new Error(req.statusText));

}

};



req.onerror = function(){

reject(new Error(req.statusText));

};



req.send();

})

}	
   	
 
function doSomething(callback){

var value = 42;



if(value === 42){

callback(null, value);

}else{

callback(new Error('에러'), null);

}

}	
  	
 
17	
  
Promise 맛보기
객체 사용
Promise의
 인스턴스
 메서드를
 이용해
 객체의

JavaScript Promises