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 패턴 공부
PPTX
Startup JavaScript 8 - NPM, Express.JS
PPTX
javascript01
PPT
호이스팅, 클로저, IIFE
PDF
7가지 동시성 모델 4장
PPTX
Startup JavaScript 3 - 조건문, 반복문, 예외처리
PPTX
Startup JavaScript 6 - 함수, 스코프, 클로저
PDF
[JS] Function.prototype.bind
Promise 패턴 공부
Startup JavaScript 8 - NPM, Express.JS
javascript01
호이스팅, 클로저, IIFE
7가지 동시성 모델 4장
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 6 - 함수, 스코프, 클로저
[JS] Function.prototype.bind

What's hot (20)

PPTX
7가지 동시성 모델 - 3장. 함수형 프로그래밍
PPTX
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
PPT
헷갈리는 자바스크립트 정리
PPTX
골때리는 자바스크립트 발표자료
PPTX
javascript02
PPTX
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
PPTX
Clojure Chapter.6
PDF
2.Startup JavaScript - 연산자
PDF
함수적 사고 2장
PPTX
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
PPTX
Angular2 가기전 Type script소개
PDF
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
PPTX
ECMAScript 6의 새로운 것들!
PDF
[143] Modern C++ 무조건 써야 해?
PDF
Es2015 Simple Overview
PDF
Learning Node Book, Chapter 5
PPTX
Promise in javascript
PDF
PPTX
Startup JavaScript 4 - 객체
PDF
Javascript - Function
7가지 동시성 모델 - 3장. 함수형 프로그래밍
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
헷갈리는 자바스크립트 정리
골때리는 자바스크립트 발표자료
javascript02
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Clojure Chapter.6
2.Startup JavaScript - 연산자
함수적 사고 2장
Javascript 함수(function) 개념, 호출패턴, this, prototype, scope
Angular2 가기전 Type script소개
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
ECMAScript 6의 새로운 것들!
[143] Modern C++ 무조건 써야 해?
Es2015 Simple Overview
Learning Node Book, Chapter 5
Promise in javascript
Startup JavaScript 4 - 객체
Javascript - Function
Ad

Similar to JavaScript Promises (14)

PDF
Promise and Bluebird
PPTX
About Visual C++ 10
PPT
프로그램은 왜 실패 하는가
PDF
03 realm 쓰기 & 질의
PPTX
Code complete chapter 19, 20 organize
PPTX
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
PPT
카사 공개세미나1회 W.E.L.C.
PDF
Spring Boot 2
PDF
처음배우는 자바스크립트, 제이쿼리 #3
PPTX
120908 레거시코드활용전략 4장5장
PDF
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
PPTX
자바스크립트 클래스의 프로토타입(prototype of class)
PPTX
Processing 기초 이해하기_20160713
PPT
Working Effectively With Legacy Code - xp2005
Promise and Bluebird
About Visual C++ 10
프로그램은 왜 실패 하는가
03 realm 쓰기 & 질의
Code complete chapter 19, 20 organize
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
카사 공개세미나1회 W.E.L.C.
Spring Boot 2
처음배우는 자바스크립트, 제이쿼리 #3
120908 레거시코드활용전략 4장5장
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
자바스크립트 클래스의 프로토타입(prototype of class)
Processing 기초 이해하기_20160713
Working Effectively With Legacy Code - xp2005
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