반응형

 

 

 


콜백함수, Promise, async-await

 

 - 비동기의 결과를 동기적으로 처리해주기 위해서 사용한다.


 

콜백 함수

다른 함수의 인자로 들어가서 나중에 실행되는 함수

 

함수내에서 A작업이 종료 후 B작업을 진행해야 할 경우 B작업을 콜백 함수라고 한다.

A작업이 끝난 후 B작업이 실행된다.

 

콜백 함수는 단순히 작업의 순서를 결정하는 것인데, 사실 이것은 함수를 사용하지 않고도 가능하다.

콜백 함수의 유용성은 비동기 작업을 할 때 나타난다.

 

 

 

A작업이 오래걸리는 작업(서버 통신)이면 비동기적으로 처리된다.

비동기로 처리되므로 아래 코드는 바로 수행되어, 비동기 처리 결과를 받는 곳에는 빈 값이 들어온다.

그래서 이를 방지하고자 비동기 처리가 완료되면, 처리 결과 값을 받은 이후에 실행되는 함수를 따로 둔다.

그 함수가 콜백 함수(비동기 처리가 완료되면 결과를 받아주는 함수)

 

 

 

사용법

function work(CallBack){

    A작업

    let B = CallBack(A작업의 결과)

}

 

work("A를 마치고", "B가 실행")

단순하게, A의 결과를 콜백 함수의 인자로 전달한다.

비동기 처리 이후 결과의 동기적 처리를 지원한다.

 


 

Promise

비동기 작업 이후 다음 작업을 연결시키는 기능을 가진 객체

성공(resolve) 또는 실패(reject)를 리턴한다.

then()내부에 resolve, catch()내부에 reject를 콜백 함수으로 작성하여 사용한다.

 

let promise = () => {  # 프로미스 객체는 작성하면 바로 execute 되기 때문에 함수안에 두는 것이 좋다.

 return new Promise((resolve, reject) => {  

      # 비동기 작업 진행         

         resolve(성공 결과 data)         

         reject(실패 결과 error)

   }

)};

 

promise().then((response) => { })   # 성공 시

promise().catch((error) => { })    # 실패 시

 

 

 

비동기 작업 체이닝(Promise 사용 이유)

then(resolve, reject)

Promise가 작업을 성공 하면 resolve() 실행, 실패하면 reject() 실행

then은 작업을 마치면 Promise를 리턴한다.

 

then()의 반환값

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

then 핸들러에서 값을 그대로 반환한 경우에는 Promise.resolve(<핸들러에서 반환한 값>)을 반환하는 것과 같다.

 

 

 

 

then 내부에 성공시 이어지는 동기 작업할 프로미스를 사용하여 체이닝을 한다.

let p1 = () => {
  return new Promise((resolve, reject)=>{
    let data = "p1 data "
    resolve(data);
  })
};

let p2 = (p1Value) => {
  return new Promise((resolve, reject) =>{
    let data = "p2 data "
    resolve(p1Value + data)
  })
};

p1()
  .then((res)=> p2(res))
  .then((res)=> console.log(res));

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

 

프로미스를 반환할 경우, 동등한 프로미스가 메서드 체인의 그 다음 then에 노출

 


 

async-await

async-await를 사용하면 훨씬 직관적이고 편하다.

내부적으로 Promise를 사용하기 때문에 Promise를 알고 있어야 한다.

 

 

async

함수앞에 async를 붙이면 Promise 객체로 사용할 수 있다.

함수를 호출하면 Promise 객체가 반환된다.

 

 

await 

반드시 async 함수 내부에서 사용해야 한다.

await은 Promise의 완료를 기다린다.

 

      사용법

      let result1 = await fetch("url", [ options ] )             

      let result2 = await promise(result1)

      # await의 뒤는 반드시 Promise 객체여야 한다.

 

await은 then()의 대체라고 보면 된다.

결과 값을 받으며 Promise의 체이닝같은 순차 로직을 명시적으로 작성할 수 있다.

 

 

에러처리

에러처리는 async 내부에서 try{  } catch{  } 로 처리한다.

async가 붙은 함수는 Promise 이므로 asyncFunction().catch((error) => { }) 로 처리해도 된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

ES5 와 ES6의 변화

 

템플릿 리터럴: console.log( ` 이름은 ${name} 나이는 ${age} `);   # 백틱

익명 함수 표현식 변경:  (a, b) => { console.log( a+b ); };   // 자바 람다식과 비슷

this: ES5에서는 window 객체를 말함, ES6에서는 자신을 둘러싸는 this를 말함

변수: let, const 추가

클래스: 클래스 키워드 추가, 생성자, 메서드, 상속, instanceof

 

 


 

 

 

https://github.com/newlecture/javascript-dom-programming-example

 

GitHub - newlecture/javascript-dom-programming-example

Contribute to newlecture/javascript-dom-programming-example development by creating an account on GitHub.

github.com

 

 

 


자바스크립트

 

✔ 데이터 타입

var과 let의 차이

var는 블록 스코프가 없다.   let은 있다.

var는 중복 변수 사용이 허용된다.(첫번째것 사용)    let은 허용되지 않는다.

var 사용은 자제

 

원시형 타입이 메서드를 사용할 때 순간적으로 Wrapper type이 되었다가

다시 원시형 타입으로 돌아온다.

 

Wrapper type: Boolean, Number(정수, 실수), String(문자, 문자열)

 

 

 

undefined & null

undefined: 선언만 하고 값이 할당되지 않은 상태

null: 빈 값이라고 명시

 

 

 

연산자

==  값의 비교  (타입 변경해서 비교)

===  값 & 타입의 비교

 

 

 

함수

자바스크립트에서는 함수도 객체의 일종

하나의 값으로 취급을 한다. 

함수가 다른 함수의 인수로도 넣어지고, 

함수를 리턴할 수도 있다.

 

(1) let f = new Function("매개 인자", "실행문;")

(2) let f = function (x, y) {  }      # 호이스팅 된다.

(3) function f(x, y){  }

(4) let f = (x, y) => {  }

 

함수의 매개 인자는 사실 큰 의미가없다. 전달 받아진 값은 전부 저장한다.

전달된 가변인자는 arguments[index]로 사용가능

 

특이한점

자바와는 다르게 변수를 전역으로 선언하고

함수 내부에서 매개변수로 넘겨주지 않아도, 해당 변수를 사용할 수 있다. (마치 Object처럼) 

변수를 전역으로 선언하면 어디서나 접근 가능 (while, if, else 뿐만 아니라 function에서도)

 

 

함수 즉시 실행 IIEF

(function( ){

})()

 

 

 

✔메서드

객체에 포함되어 있는 함수는 메서드라고 한다.

Math.floor()

 

 

 

배열

let arr = new Array()

let arr = []

한 배열에 여러 타입을 담을 수 있다.

 

메서드

length()

pop(), push(), shift(), unshift()

slice(start, end)

concat()

indexOf(), lastIndexOf(), includes()

 

for in 은 모든 프로퍼티를 순회하므로 성능 저하. 배열에서는 for of 사용 권장

 

 

 

Object (Map 형태)

let obj = new Object()

let obj = {}

객체는 key : value 프로퍼티를 저장한다.

 

let obj = {name: 'name'}

key: value  # 내부에서는 = 을 사용하지 않고 : 사용

 

다른 언어와 다르게 먼저 정의를 하지 않고 객체를 만든 이후 정의할 수 있다.

(1)   obj.math = 50; 

(2)   obj['math'] = 50 

 

Object의 프로퍼티 키는 항상 문자열이거나, 심볼형이어야 한다.

심볼은 유일성이 보장되는 자료형, 식별자로 사용된다.

함수도 프로퍼티로 저장할 수 있다.

 

this

자바스크립트 this는 런타임때 결정된다.

this가 있는 메서드를 사용하는 객체의 것을 사용한다.

** this 가 화살표 함수 안에서 사용되면 화살표 함수를 감싸는 함수의 this를 사용한다.

 

생성자 함수 

객체의 생성을 해주는 함수다.

규칙: 대문자로 시작, 생성할 땐 new Person()

 

 

 

Class

사용 방법은 자바와 굉장히 유사

 

캡슐화

getter & setter로 접근한다.

   get ---> instanceName.value1   set ---> instanceName.value1= 'value'

프로퍼티를 부르거나, 값을 할당할 때 get, set이 호출되어 사용하므로 캡슐화가 가능하다.

 

class test{
  constructor(value1) {
    this.value1 = value1;
  }

  get value1(){
    return this._value1;
  }

  set value1(value1){
    this._value1 = value1;
  }
}

주의점: get, set 함수 내부에서 this.value1를 사용하면 다시 get이 호출되고, 순환 참조가 발생하므로 this._value1를 사용

** 함수명은 필드 접근 방법이고, 내부적으로는 _value에 값을 저장

 

static

static 필드와 static 메서드가 있다.

 

상속

extends 키워드로 상속한다.

메서드 오버라이딩이 된다.  super() 키워드도 사용 가능

instanceof로 인스턴스 타입 검사도 가능

 

 

 

JSON(javascript object notation)

자바스크립트 오브젝트를 String으로 표현한 방식

표현식을 간단하게 할 수 있다. 사용 방법이 간단하여 다목적으로 사용됨.

 

문자열, 문자는 전부 ' ' 로 표기하는 것이 html " " 과의 충돌 방지가 된다.

 

object내부의 메서드, 심볼, undefined는 무시된다.

 

 

 

JSON 파서

JSON 데이터가 문자열로 왔을 때 사용한다.

 

eval()

eval("var aa = 50;")

eval("var bb =" + data + ";")

 

parse() 

json -> object

 

stringify()

JSON.stringify("{id : 50 , name = "cha" }") ==> {"id":50, "name" = "cha"}

object -> json

 

 

 

 


 

 

제어문

다른 언어와 제어문은 동일하다.

 

for Key in Object

[배열일 경우 index], [object일 경우 key]

 

for Element of Array

배열일 경우 사용 권장

 

 

 

 

호이스팅

<script> 지역내 모든 선언된 function은 상단에서 먼저 선언 된다. 

 

함수 표현식 - 값처럼 선언을 하면 먼저 선언되지 않고 실행 흐름에 맞게 선언된다.

블록 스코프 안에서 선언된 경우이다.

 

 

 

✔프로토타입

일종의 템플릿 객체

종류별로 해당되는 종류가 같이 공유하는 객체이다. 

따로 생성하지 않고, 하나의 프로토타입 메서드를 거치면 이용하면 효율적이기 때문이다.

Array.prototype.adddddd = () => "추가"

 

 

 


DOM을 다루기 전 준비

 

브라우저 객체(BOM)

window

window.history

window.location

window.document

 

DOM(Document Object Model)

BOM(Browser Object Model)의 하위

html 요소들을 객체화(js object)하여 js가 조작할 수 있게 함

 

요소 객체 정보 보기

console.dir(요소)

 


 

 

이벤트 조작

(1) html 속성에 이벤트 동작

html 태그에 속성 onclick = 함수() 

html에 스크립트 코드를 적어 사용하게 할 수 있다.

js 와 html 이 결합되어 좋은 방식은 아니다.

 

(2) id, class, name으로 접근하여 이벤트 동작

html과 js가 분리

 

 

 

JS 코드 초기화

(defer src 사용하면 쓰지않아도 된다.)

윈도우가 로드가 완료되었을 때 js를 로드 시킨다.

window.onload는 덮어씌우기 때문에 이전 js 파일을 동작시키지 않는다.

addEventListener는 중복으로 정의해도 누적되어 정상동작한다.

window.addEventListener("load", function(){ // load 이후 동작, 여러 load를 누적시킨다.
         
            };
});

 

 

JS 코드 분리

<script defer src =" js파일 경로 "  ></script>

 


노드

 

노드의 Type

document(노드의 최상위)

document type - 옛날에는 DOM type이 여러개였다.

element(태그) - attr(태그안 속성), entity(예약어 - lt, gt < >), entityReference(예약어 사용 보조 & ;), text

comment - 주석

cdata section(예약어를 많이 사용할 때 감싸서 편하게 사용)

notation(속성의 값 - #ffff,px)

 

 

 

✔ 노드 선택

querySelector()   첫번째 하나만 가져옴

querySelectorAll()   배열로 전부 가져옴

 

클래스 선택: document.querySelector(".class")

id 선택: document.querySelector("#id")

태그 선택: div1.querySelector("태그") 

태그 속성 선택: document.querySelector("input[name='x']") 

 - css 셀렉터 방식이 된다.

 

 

지역화 노드 선택

let qs = querySelector() 를 통해 (지역화를 시키고)

qs.querySelector()를 통해 자식 노드를 가져올 수 있다. (지역화 내에서 가져오기)

 

id - 유일

("#id")

class - 여러개 지정 가능

(".class")

name - 여러개 지정 가능

(input[name="name"]) 

 - id로 지역화 시키고, class, 태그를 사용하는 방식

 

 

 

노드의 부모, 자식

parentElement: 부모 노드로 이동할 수 있다. 자식 노드 전부 포함

childNode: Element, 공백, 주석, 텍스트도 모든 Node로 포함

children: Element만 자식으로 포함

배열로 사용된다.

 

 

 

 

노드 추가

노드 생성 기능은 document 객체가 갖고 있다.

태그, 텍스트를 주로 생성한다.

 

 

append(텍스트 or 노드 ...)

appendChild는 인자로 노드만 받는다.

 - 배열을 추가해도 자식 노드의 가장 아래에 붙기 때문에 array 순서가 맞는다.

 

 

 

innerHTML 이용 (사용 권장 x)

innerHTML += 은 가져온 후 수정한 후 돌려준다.  이 방식은 성능 이슈를 일으킨다.

 

매번 노드를 create하는 방식 보다 innerHTML을 이용해서 생성

let new1 =  '<a href="">' + data + '</a>';

var li2 = document.createElement("li");

li2.innerHTML = new1;

div.append(li2);

 - 가장 밖 태그를 document.create로 만든 후 innerHTML로 붙여주는 방식

 

 

 

insertAdjacentHMTL

append()와 같이 문자열을 html로 만들어 준다.

let str = '<li><p>text</p></li>';

ul1.insertAdjacentHTML("afterbegin", str);

 - append(), insertAdjacentHMTL()가 유용

 

 

 

✔ 노드 삭제

노드.remove()

부모를 통해 접근하지 않고 바로 지울 수 있다. 

하위 노드들도 모두 삭제

 

 

 

노드 복제

cloneNode(true) - 내부 태그까지 전부 복사한다.

cloneNode(false) - 껍데기만 복사한다.

 

template

복사할 태그가 없을 수도 있으므로 html <template></template> 태그를 이용해줄 수 있다.

template 태그는 화면에 보이지 않고, 복제를 위해 이용된다.

template 태그 하위를 querySelector를 쓰려면 .content를 사용해야 한다. 또는 importNode

 

 

 

노드 삽입 및 대체

모든 노드 선택              태그 노드만 선택

parentNode               parentElementNode

firstChild                     firstElementChild

lastChild                      lastElementChild

previousSibling        previousElementSibling

nextSibling                 nextElementSibling

 

부모노드.insertBefore(삽입 노드, 기준 노드) // 기준 노드 앞에 insert

 

 

기준노드.insertAdjacentElement(position, node)

position - beforbegin, <target> afterbegin, beforeend, </target> afterend

 

 

insertAdjacentElement, insertAdjacentHMTL

자주 사용되고 편하다.

 

 

 

HTML 태그 이용 & CSS스타일 변경

node.src = 경로

일반적으로 HTML의 속성과 노드 속성의 이름이 일치한다.

 

node.style.border = "100px"

css는 style을 명시해줘야함

 

카멜 케이스로 css style 변경 가능 (수치 단위도 같이 넣어줘야한다.)

img.style.borderColor = "#ffffff"


이벤트 객체

 

✔ 이벤트 객체에 따라서 갖고 있는 기능이 다르다.

keyboardEvent, inputEvent, mouseEvent, focusEvent, compositionEvent

상위 인터페이스인 Event를 전부 상속 받았다.

 

 

target (이벤트 발생 정보)

클릭이 발생하면 event 객체가 전달된다. 이벤트 객체에는 이벤트의 정보가 있다.

function(event){

    event.target.태그

}

 

 

이벤트 버블링

하위 태그를 클릭하면 상위 태그들에게도 이벤트가 전파된다.

상위 태그로 전파되므로 상위 태그에서 이벤트를 잡아서 처리하면 여러 하위 태그의 이벤트를 한번에 처리해줄 수 있다.

event 객체가 클릭된 하위 태그 정보를 갖고 있다.

 

 

e.target.classList.contains("사용할 class")

bookBinding.addEventListener("click", (event) => {
  if(!event.target.classList.contains("loanBtn"))
    return;

특히, 동적으로 생성된 HTML에 addEventListner는 동작하지 않는다.

이벤트 버블링으로 동적 생성 되지않은 태그에서 이벤트를 처리해주어야 한다.

 

 

버블링 멈추기 & 태그 기본행위 막기

event.stopPropagation() 

상위태그로의 전파를 차단한다.

 

event.preventDefault()

a태그는 page load가 기본 행위, 이를 막아줄 수 있다.

 

 

 

이벤트 트리거

<input type="file"> 인 경우 브라우저에 따라 모양이 다르게 나온다.

일관되게 보이도록 다른 UI버튼을 만들어 <input type="file"> 이 동작하게 만든다.

 

트리거버튼.onclick = function(){

    var event = new MouseEvent("click", {

        'view' : window,

        'bubbles' : true,

        'cancelable' : true

    });

    트리거대상.dispatcherEvent(event);

};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'프로그래밍 > 자바스크립트' 카테고리의 다른 글

[JS] 콜백 함수, Promise, async-await  (0) 2022.09.05

+ Recent posts