티스토리 뷰

비동기프로그래밍 관련한 설명을 잘 풀어서쓴 유투브영상 주소 첨부드립니다~ 

(https://www.youtube.com/watch?v=m0icCqHY39U&feature=youtu.be)

 

[모던자바스크립트] 15.7 커스텀 이벤트(사용자 정의 이벤트)

: 객체 지향 프로그래밍에서 객체와 객체 사이의 관계를 느슨하게 연결하는 수단으로 사용되고 있습니다.

 

15.7.1 커스텀 이벤트를 생성하는 방법 

: 독자적인 이벤트를 생성해서 원하는 타이밍에 발생시킬 수 있습니다.

 

1. createEvent()로 이벤트 객체 생성 

2. 초기화 함수 안에서 이벤트 객체를 초기화

3. 이벤트를 받을 요소 객체에 대해 dispatchEvent() 호출 후 이벤트를 보냅니다 (dispatch)

//객체 생성
var event = document.createEvent(type);

// 생성된 이벤트 객체는 해당 이벤트의 타입에 따라 별도의 초기화 메서드로 초기화 작업을 해야합니다.
event.initEvent(type, bubbles, cancelable)


//버블링을 하면서 취소할 수 없는 클릭 이벤트 객체를 생성 후 초기화하는 코드 작성 예
var event = document.createEvent("HTMLEvents");
event.initEvent("click", true, false);

//이벤트 보내기 : 이벤트 객체 생성하고 초기화 작업을 끝낸 후에는 이벤트 타깃 요소를 상대로 이벤트를 보냅니다. 
//        	   이벤트는 요소 객체의 dispatchEvent메서드로 보냅니다.
      
target.dispatchEvent(event);
  • type          : 이벤트 유형을 뜻하는 문자열 ("click","mouseup" 등)
  • bubbles     : 버블링할지를 나타내는 논리값
  • cancelable : 취소할 수 있는 이벤트로 만들지를 나타내는 논리값

type으로 사용할 수 있는 주요 값 표

type 설명 이벤트 객체의 초기화 메서드
"UIEvents" 사용자 인터페이스 이벤트 event.initUIEvnet
"MouseEvents" 마우스 이벤트 event.initMouseEvnet
"TextEvent" 텍스트 이벤트 event.initTextEvent
"KeyboardEvent" 키보드 이벤트 event.initKeyboardEvent
"MutationEvents" 변이 이벤트 event.initMutationEvents
"HTMLEvents" HTML 이벤트 event.initHTMLEvents
"CustomEvent" 사용자 지정 이벤트 event.initCustomEvent

 

Chrome, firefox 예제

// 이벤트 생성
var event = document.createEvent('Event');
event.initEvent('test', true, true); // 이벤트 이름은 'test'
 
// 이벤트 리스너 등록
document.addEventListener('test', function (e) {
    alert('test 이벤트 발생');
}, false);
 
// 이벤트 호출
document.dispatchEvent(event);

 

IE 예제 (IE 구버전에서는 createEventObject 라는 함수를 사용합니다.)

// 이벤트 생성
var event = document.createEventObject();
 
// 이벤트 리스너 등록
document.attachEvent('test', function (e) {
    alert('test 이벤트 발생');
});
 
// 이벤트 호출
document.fireEvent('test', event);

 

 

See the Pen qBbQyyd by jeongahlee (@jeongahlee) on CodePen.

 

 

 

 

 

 

15.7.4 커스텀 이벤트와 표준 이벤트의 차이점

: 사용자가 클릭 등의 행위로 발생시킨 표준 이벤트와 자바스크립트 코드로 보낸 커스텀 이벤트는 이벤트 객체의 isTrusted 프로퍼티로 구별할 수 있습니다. isTrusted 값이 True 면 표준 이벤트. false 커스텀 이벤트 입니다.

 

15.7.5 커스텀 이벤트 용도

: dispatchEvent() 이벤트를 보내면 동기적으로 실행 됩니다. 

객체 지향 브로그래밍에서는 프로그램을 객체단위로 작성합니다. 객체와 객체는 상호 간의 통신 결과를 바탕으로 프로그램을 동작시킵니다.

객체와 객체가 통신하는 주요 수단은 인수로 콜백 함수를 넘기는 것이며 또 다른 통신 방법이 바로 커스텀 이벤트를 보내는 것입니다.

즉, 한쪽 객체에서는 이벤트를 발생시키고 다른 객체에서는 그 이벤트를 처리하는 이벤트 리스너를 등록해서 처리하는 식입니다.

이 방법을 사용하면 객체와 객체 사이의 통신 수단을 크게 고민하지 않아도 되며, DOM이 제공하는 표준적인 방법을 사용해서 객체와 객체가 통신하도록 만들 수 있습니다. 

 

 

출처: https://includestdio.tistory.com/41 [includestdio]

 

 

 

15.8 비동기 처리를 간결하게 작성하는 Promise

: ECMAScript6부터 추가된 Promise

: 복잡하게 중첩된 코드를 알아보기 쉽게 작성할 수 있습니다.

 

15.8.1 비동기 처리의 예

//setTimeout, addEventListener

console.log("a");
setTimeout(function(){ console.log("b"); }, 0);
console.log("c")

// a > c > b
// setTimeout함수로는 인수로 받은 함수를 일정 시간이 흐른 후에 실행하도록 예약하는 처리만 하고,
// 그 다음에는 곧장 다음 코드가 실행되기 때문입니다. 
// 앞 코드는 0초 후에 실행하도록 성정이 되어 있지만 실제로는 0초 후에 실행되지 않습니다.
// 호출 스택에 실행 문맥이 남아 있을때는 
// 그 작업이 끝날 때까지 기다렸다가 0초 후에 가능한 빨리 실행 되기 때문입니다.


//이러한 상황해서 코드를 싱행 순서에 따라 실행하고자 할때는 주로 콜백 함수를 중첩하는 방법을 사용합니다.

function sleep(callback){
	setTimeout(function(){
		callback();
	}, 1000);
}

sleep(function(){
	console.log("A");  //1초후 A
	sleep(function(){
		console.log("B"); //그다음 1초후 B
		sleep(function(){
			console.log("C"); //그다음 1초후 C
		})
	})
	
})

// A > B > C
// 이 예를 볼 수 있듯이 여러개 중첩하면 작업 내용을 이해하기 어려워집니다. 
// 이를 가리켜 '콜백 지옥(callback Hell)' 이라고도 부릅니다.

 

15.8.2 Promise 기본

: 비동기 처리를 실행하고 끝난 후 다음 처리를 실행하기 위한 용도로 사용합니다.

//Promise 객체 생성 (생성자 사용법)
var promise = new Promise(function(resolve, reject) {...});



var promise = new Promise(function(resolve, reject){
	setTimeout(function(){
		console.log("Promise_A");
		resolve();  //함수가 실행되면 then 메서드에 등록한 함수가 호출됩니다.
	}, 1000)
})
promise.then(function(){
	console.log("Promise_B");
})

// Promise_A > Promise_B


//promise 종로시키는 resolve 함수와 then 메서드

//resolve 함수는 Promise를 종료 시킵니다.
//resolve 함수에 인수로 넘긴 값은 then메서드에 인수로 넘긴 함수에 전달되어
// 다음 처리를 위해 사용됩니다.

promise.then(onFullfilled);

var promiseR = new Promise(function(resolve, reject){
	setTimeout(function(){
		var name = prompt("이름을 입력하세요");
		resolve(name);
	}, 1000);
});
promiseR.then(function(name){
	console.log("안녕하세요." + name + "님");
})


//Promise 를 싱패로 처리하는 reject함수와 catch메서드
//reject함수는 Promise를 종료시킵니다.
//resolve 함수와 마찬가지로 값을 넘길 수 있습니다.
//reject함수가 실행되면 THEn메서드에 넘긴 함수는 실행되지 않습니다.
//그대신 catch메서드에 넘긴 함수가 실행됩니다.

promise.catch(onRejected);



var promiseT = new Promise(function(resolve, reject){
	setTimeout(function(){
		var n = parseInt(prompt("10미만의 숫자를 입력하십시오")); //1초후에 입력 대화상자 표시
		if(n <= 10){
			resolve(n);
		} else {
			reject(`오류 : ${n}은 10이상입니다. `)
		}
	}, 1000);
})
promiseT.then(function(num){  // 10미만이면 then 실행
	console.log(`2^${num} = ${Math.pow(2,num)}`);
})
.catch(function(error){  //10이상이면 catch 실행
	console.log(error);
})



//then의 두번째 인수 : 두 번째 인수로 실패 콜백 함수를 지정할 수 있습니다.
promise.then(onFullfilled, onRejected);



var promiseN =  new Promise(function(resolve, reject){
	setTimeout(function(){
		var number = prompt("10미만의 숫자를 입력하십시오") 
		if(number <= 10){
			resolve(number);
		} else {
			reject(`오류 : ${number}은 10 이상입니다.`);
		}
	}, 1000);
})

promiseN.then(
	//처리가 성공적으로 끝났을 때 호출되는 콜백 함수
	function(num){
		console.log(`2^${num} = ${Math.pow(2, num)}`);
	},
	function(error){
		console.log(error)
	}
)

  • resolve : 함수 안의 처리가 끝났을 때 호출해야하는 콜백 함수. 어떠한 값도 인수로 넘길 수 있음. 이 값은 다음 처리를 실행하는 함수에 전달 됩니다.
  • reject : 함수 안의 처리가 실패했을 때 호출해야하는 콜백 함수. 어떠한 값도 인수로 넘길 수 이음. 대부분의 경우 오류 메시지 문자열을 인수로 사용합니다.
  • onFullfilled함수 : 성공 콜백 함수 라고 하며 promise 안의 처리가 정상적으로 끝났을 때 호출 되는 함수 입니다. 인수로듣 response를 받습니다. 

예시 코드펜 : https://codepen.io/jeongahlee/pen/NWxE

 

See the Pen [Javasccript] Promise 비동기 처리 연결 계산 예시 by jeongahlee (@jeongahlee) on CodePen.

 

 

 

 

Promise.all() :  비동기 처리 여러 개를 병렬로 실행 할 수 있습니다. 모든 처리가 성공적으로 끝났을 때만 다음 작업을 실행하도록 만들수 있습니다. 

Promise.all(iterable);

iterable :  Promise 객체가 요소로 들어 있는 반복 가능한 객체입니다. (객체를 병렬로 실행) 

 

 

Promise.race() : 가장 먼저 종료한 Promise 객체의 결과만 다음 작업으로 보냅니다. 

먼저 종료한 작업이 성공했을 때는 성공 콜백 호출, 실패시에는 실패 콜백 호출 합니다. 

가장 먼저 종료한 작업의 결괏값만을 반환합니다.

Promise.race(iterable);

 

'JAVASCRIPT' 카테고리의 다른 글

[Javascript] 생성자와 클래스 구문  (0) 2020.08.17
[JavaScript] HTTP제어(Ajax)  (0) 2020.07.19
[Javascript ] falsy truthy  (0) 2020.07.01
[Javascript] 문서제어  (0) 2020.06.14
[javascript] 웹브라우저 객체 2  (0) 2020.06.07
댓글
© 2018 eh2world