SlideShare a Scribd company logo
 	
  
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의
 인스턴스
 메서드를
 이용해
 객체의

More Related Content

PPTX
Promise 패턴 공부
HongGun Yoo
 
PPTX
Startup JavaScript 8 - NPM, Express.JS
Circulus
 
PPTX
javascript01
ChangHyeon Bae
 
PPT
호이스팅, 클로저, IIFE
ChangHyeon Bae
 
PDF
7가지 동시성 모델 4장
HyeonSeok Choi
 
PPTX
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Circulus
 
PPTX
Startup JavaScript 6 - 함수, 스코프, 클로저
Circulus
 
PDF
[JS] Function.prototype.bind
Jinhyuck Kim
 
Promise 패턴 공부
HongGun Yoo
 
Startup JavaScript 8 - NPM, Express.JS
Circulus
 
javascript01
ChangHyeon Bae
 
호이스팅, 클로저, IIFE
ChangHyeon Bae
 
7가지 동시성 모델 4장
HyeonSeok Choi
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Circulus
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Circulus
 
[JS] Function.prototype.bind
Jinhyuck Kim
 

What's hot (20)

PPTX
7가지 동시성 모델 - 3장. 함수형 프로그래밍
Hyunsoo Jung
 
PPTX
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Young-Beom Rhee
 
PPT
헷갈리는 자바스크립트 정리
은숙 이
 
PPTX
골때리는 자바스크립트 발표자료
욱진 양
 
PPTX
javascript02
ChangHyeon Bae
 
PPTX
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Circulus
 
PPTX
Clojure Chapter.6
hyun soomyung
 
PDF
2.Startup JavaScript - 연산자
Circulus
 
PDF
함수적 사고 2장
HyeonSeok Choi
 
PPTX
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Young-Beom Rhee
 
PPTX
Angular2 가기전 Type script소개
Dong Jun Kwon
 
PDF
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
NAVER D2
 
PPTX
ECMAScript 6의 새로운 것들!
WooYoung Cho
 
PDF
[143] Modern C++ 무조건 써야 해?
NAVER D2
 
PDF
Es2015 Simple Overview
Kim Hunmin
 
PDF
Learning Node Book, Chapter 5
Ji Hun Kim
 
PPTX
Promise in javascript
namwook lim
 
PDF
Enum
Hyosang Hong
 
PPTX
Startup JavaScript 4 - 객체
Circulus
 
PDF
Javascript - Function
wonmin lee
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
Hyunsoo Jung
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Young-Beom Rhee
 
헷갈리는 자바스크립트 정리
은숙 이
 
골때리는 자바스크립트 발표자료
욱진 양
 
javascript02
ChangHyeon Bae
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Circulus
 
Clojure Chapter.6
hyun soomyung
 
2.Startup JavaScript - 연산자
Circulus
 
함수적 사고 2장
HyeonSeok Choi
 
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Young-Beom Rhee
 
Angular2 가기전 Type script소개
Dong Jun Kwon
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
NAVER D2
 
ECMAScript 6의 새로운 것들!
WooYoung Cho
 
[143] Modern C++ 무조건 써야 해?
NAVER D2
 
Es2015 Simple Overview
Kim Hunmin
 
Learning Node Book, Chapter 5
Ji Hun Kim
 
Promise in javascript
namwook lim
 
Startup JavaScript 4 - 객체
Circulus
 
Javascript - Function
wonmin lee
 
Ad

Similar to JavaScript Promises (11)

PPTX
Promise
동욱 박
 
PDF
Promise and Bluebird
Daniel Ku
 
PDF
ES6 for Node.js Study 4주차
승빈이네 공작소
 
PDF
Javascript 조금 더 잘 알기
jongho jeong
 
PDF
Call back 발표자료
JangHee Lee
 
PDF
Node.js 현재와 미래
JeongHun Byeon
 
PPTX
javascript03
ChangHyeon Bae
 
PDF
Deferred object
항희 이
 
PPTX
프론트엔드스터디 E05 js closure oop
Young-Beom Rhee
 
PDF
Javascript Closure
지수 윤
 
PDF
ES6 for Node.js Study 5주차
승빈이네 공작소
 
Promise
동욱 박
 
Promise and Bluebird
Daniel Ku
 
ES6 for Node.js Study 4주차
승빈이네 공작소
 
Javascript 조금 더 잘 알기
jongho jeong
 
Call back 발표자료
JangHee Lee
 
Node.js 현재와 미래
JeongHun Byeon
 
javascript03
ChangHyeon Bae
 
Deferred object
항희 이
 
프론트엔드스터디 E05 js closure oop
Young-Beom Rhee
 
Javascript Closure
지수 윤
 
ES6 for Node.js Study 5주차
승빈이네 공작소
 
Ad

More from 우영 주 (19)

PDF
스트리밍과 디지털 권리 관리
우영 주
 
PDF
스트리밍과 플레이어
우영 주
 
PDF
프런트엔드개발, 지금과 다음
우영 주
 
PDF
컴포넌트 관점에서 개발하기
우영 주
 
PDF
아재가 젊은이에게 사랑받는 마크업을 하는 방법
우영 주
 
PDF
Introduce Guetzli
우영 주
 
PDF
스코프와 실행문맥
우영 주
 
PDF
좋은 기능을 만드는 방법
우영 주
 
PDF
서비스를 성공적으로 만드는 방법
우영 주
 
PDF
다함께, FluxUtils 한바퀴!
우영 주
 
PDF
BEM을 깨우치다.
우영 주
 
PDF
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
우영 주
 
PDF
명세부터 깨우치는 FILEAPI
우영 주
 
PDF
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
우영 주
 
PDF
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
우영 주
 
PPTX
Javascript Test Double Sinon.js
우영 주
 
PPTX
LESS와 EMMET
우영 주
 
PPTX
HTML5 BOILERPLATE를 소개합니다.
우영 주
 
PPTX
이클립스로 GIT 사용하기
우영 주
 
스트리밍과 디지털 권리 관리
우영 주
 
스트리밍과 플레이어
우영 주
 
프런트엔드개발, 지금과 다음
우영 주
 
컴포넌트 관점에서 개발하기
우영 주
 
아재가 젊은이에게 사랑받는 마크업을 하는 방법
우영 주
 
Introduce Guetzli
우영 주
 
스코프와 실행문맥
우영 주
 
좋은 기능을 만드는 방법
우영 주
 
서비스를 성공적으로 만드는 방법
우영 주
 
다함께, FluxUtils 한바퀴!
우영 주
 
BEM을 깨우치다.
우영 주
 
[토크아이티] 프런트엔드 개발 시작하기 저자 특강
우영 주
 
명세부터 깨우치는 FILEAPI
우영 주
 
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
우영 주
 
진보한 개발 환경에서 품질 좋은 코드 생산 (WebStorm)
우영 주
 
Javascript Test Double Sinon.js
우영 주
 
LESS와 EMMET
우영 주
 
HTML5 BOILERPLATE를 소개합니다.
우영 주
 
이클립스로 GIT 사용하기
우영 주
 

JavaScript Promises