반응형
기존에 ajax와 같은 비동기 요청이 종료가 되고 특정한 작업을 수행하고 싶을경우 콜백함수를 설정하여 진행했었다.
1 2 3 4 5 6 7 8 9 10 11 | Common.sendAjax({ url: Common.getFullPath('user/cert/check'), param: { 'otp' : $otpNum.val(), 'userId' : $joinEmail.val() }, type: 'POST', success: (e) => { // 성공 시 발생할 콜백함수 }, failed: () => { // 실패시 발생할 콜백함수 } }); | cs |
이런 비동기 프로그래밍은 기존 동기식 프로그래밍 보다 작업을 요청하고 다른 작업을 할 수 있는 장점이 있다. 하지만 이는 그 유명한 콜백 지옥을 만들 수 가 있다.
아래 보면 이런 콜백 지옥을 경험을 다들 해봤을거다. 실제로 이렇게 콜백지옥이 발생한 경우가 굉장히 많다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Common.sendAjax({ url: Common.getFullPath('user/cert/check'), param: { 'otp' : $otpNum.val(), 'userId' : $joinEmail.val() }, type: 'POST', success: (e) => { // 성공 시 발생할 함수 Common.sendAjax({ success:(e) => { Common.sendAjax({ /** 콜백지옥 */ }); } }); }, failed: () => { // 실패시 발생할 함수 } }); | cs |
Promise를 적용해서 비동기 프로그래밍 진행하기.
promise 객체를 만들고 동작을 수행한 후 성공하면 resolve, 실패할 경우에 reject 메소드를 실행시킨다. resolve 메소드를 실행할 경우 promise 상태는 Fulfilled 상태가 된다. 그리고 reject 메소드가 실행되면 Rejected 상태가 된다.
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 37 38 39 40 41 42 43 44 45 46 47 | // Promise 'use strict'; const test = module.exports; test.proTest = (isSucess) => { return new Promise((resolve, reject) => { isSucess ? resolve('re1') : reject(new Error('r2')); }); }; // 테스트 코드 'use strict'; const promiseTest = require('../../lib/libraryTest/promise-test'); const assert = require('assert'); const chai = require('chai'); const should = chai.should; const expect = chai.expect; describe('promise 테스트', () => { it('resolve 테스트', async () => { try { let resolveTest = await promiseTest.proTest(true); assert(resolveTest == 're1'); } catch (e) { should.not.exist(e); } }); it('reject 테스트', async () => { try { let resolveTest = await promiseTest.proTest(false); } catch (e) { console.log(e); expect(e).to.exist; } }); }); | cs |
Promise Chaining
프로미스를 이용해서 콜백 지옥 대신에 프로미스를 연결해서 연속된 동작을 진행할 수 있다. 하지만 이런 프로미스 체이닝도 문제가 있는게 에러 발생시에 catch로 받을 수 있지만 어느 프로미스에서 발생한 에러인지를 알기가 어렵다는 문제가 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 'use strict'; const test = module.exports; test.proTest = (isSucess) => { return new Promise((resolve, reject) => { isSucess ? resolve('re1') : reject(new Error('r2')); }).then((result) => { return result + 'babo'; }).then((result) => { return result + 'Hi!'; }).catch((err) => { return err; }); }; | cs |
반응형
'web > javaScript' 카테고리의 다른 글
Javascript에서 epoch second 구하기 (0) | 2018.10.13 |
---|---|
nodejs 비동기 프로그래밍을 위한 deferred (0) | 2018.10.06 |
Rest Operator와 Spread Operator (0) | 2018.10.06 |
html의 화면을 캡쳐해서 이미지로 변경하는 html2canvas와 pdf로 저장하는 jsPDF 라이브러리 소개 (8) | 2018.06.29 |
JQuery함수의 append와 appendTo 차이 (0) | 2018.06.19 |