jQuery (23)

반응형

 

Ajax

 

: 비동기적으로 데이터를 주고 받는 방식으로 서버와 데이터를 교환하는 기술의 하나다.

전체 페이지를 리로드 하지 않고 웹 페이지의 일부를 업데이트 가능하게 한다.

 

 

- Ajax 동작 원리

 

Ajax 동작 원리

 

 

 

서버 Request

 

 

XMLHttpRequest객체를 이용하여 전체 페이지를 다시 로드 하지 않고 웹 페이지의 일부를 업데이트 할 수 있게 한다.

 

 

  • 속성
속성 설명
onreadystatechange readyState값이 변경될 때 호출할 함수 정의
readyState 0: 요청 준비             1: 서버 연결 완료
2: 요청 받음             3: 요청 처리 중
4: 요청 처리 완료 후 응답 준비
responseText 서버로부터 반환된 응답 정보 (문자열)
responseXML 서버로부터 반환된 응답 정보 (XML)
Status 요청에 대한 상태 코드
200: “ok” 403: “Forbidden” 404: “Not Found”
statusText 요청에 대한 상태 문자

 

 

 

  • 메소드
메소드 설명
Open(method, url, async, user, pw) 요청 설정
method : 요청 유형 (get/post)
url : 호출할 url
async : 비동기 호출 여부 (true/false)
new XMLHttpRequest() XMLHttpRequest 객체 생성
abort() 현재 요청 취소
getAllResponseHeaders() header 정보 반환
getResponseHeader(key) header 정보 중 특정 값 반환
send() 서버로 요청 전송 (get방식)
send(string) 서버로 요청 전송 (post방식)
setRequestHeader() 요청 header에 정보 설정

 

 

 

서버 Response

 

 

  • 속성
속성 설명
responseText 서버로부터 반환된 응답 정보 (문자열)
responseXML 서버로부터 반환된 응답 정보 (XML)

 

 

 

  • 메소드
메소드 설명
getResponseHeader(key) header 정보 중 지정된 정보만 반환
getAllResponseHeaders() 모든 header 정보를 반환

 

 

 

AJAX 작동 순서

 

 

<!DOCTYPE html>
<meta charset="UTF-8">
<script>
    // 1. 통신을 위한 객체 생성
    let req = new XMLHttpRequest();

    // 2. 요청 정보 설정
    req.open("get", 'test.txt', true); // true(default이므로 생략 가능, 비동기로 작업)

    // 3. 요청 정보 서버로 전달
    req.send();

    // 4. 이벤트를 통해 응답 가능 상태 알림
    req.onreadystatechange = function(){
        console.log(req.readyState); // 2(요청 받음), 3(요청 처리 중), 4(요청 처리 완료 후 응답 준비) 출력
        if(req.readyState == 4 && req.status == 200){
            console.log( req.responseText ); // 요청을 받아서 콘솔에서 표현
        }
    }
</script>

 

결과 화면1

 

 

=> 일방적인 작성 순서

<!DOCTYPE html>
<meta charset="UTF-8">
<script>
    // 1. 통신을 위한 객체 생성
    let req = new XMLHttpRequest();

    // 2. 요청 정보 설정
    req.open("get", 'test.txt', true); // true(default이므로 생략 가능, 비동기로 작업)

    // 3. 요청 정보 서버로 전달
    // req.send(); // 처리되는 데이터의 양이 미미할 때
    
    // 4. 이벤트를 통해 응답 가능 상태 알림
    req.onreadystatechange = function(){
        console.log(req.readyState); // 2(요청 받음), 3(요청 처리 중), 4(요청 처리 완료 후 응답 준비) 출력
        if(req.readyState == 4 && req.status == 200){
            console.log( req.responseText ); // 요청을 받아서 콘솔에서 표현
        }
    }

    // 3. 요청 정보 서버로 전달
    // 요청에 대한 응답이 4번 항목의 처리보다 먼저 반환될 경우 상태코드가 누락될 가능성을 최소화하기 위해 3번을 가장 후순위로 처리한다.
    req.send();
</script>

 

 

 

AJAX 예제

 

 

dummy.txt

목캔디

 

 

ajax.csv

이름,나이,만화
아시타카,17,원령 공주
키키,13,마녀 배달부 키키
메이,4,이웃집 토토로
하울,27,하울의 움직이는 성

 

 

ajax.json

[
    {
        "name":"뽀로로", 
        "type":"펭귄", 
        "alias":"뽀롱뽀롱"
    },
    {
        "name":"크롱", 
        "type":"공룡", 
        "alias":"개구쟁이"
    },
    {
        "name":"루피", 
        "type":"비버", 
        "alias":"요리공주"
    },
    {
        "name":"에디", 
        "type":"여우", 
        "alias":"똑똑박사"
    }
]

 

 

ajax.xml

<!-- XML
데이터로 표현하는 마크업 언어의 하나
주로 서버 간 데이터 통신에 활용
html과 같이 시작태그와 종료태그로 값을 정의하고 속성값으로 추가정보를 부여 -->

<friends>
    <friend>
        <name>포비</name>
        <type>백곰</type>
        <alias>낚시왕</alias>
    </friend>
    <friend>
        <name>해리</name>
        <type>벌새</type>
        <alias>가수왕</alias>
    </friend>
    <friend>
        <name>로디</name>
        <type>로봇</type>
        <alias>척척박사</alias>
    </friend>
    <friend>
        <name>패티</name>
        <type>펭귄</type>
        <alias>춤신춤왕</alias>
    </friend>
</friends>

 

 

위치

예제가 있는 폴더 안에 폴더를 생성하여 넣어둔다.

 

 

  • ajax로 txt 출력
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>ajax</button>
    <div>출력영역</div>

<script src="../js/jquery-3.7.1.min.js"></script>
<script>
    // 버튼 눌렀을 때 AJAX로 dummy.txt에서 제공하는 응답데이터를 화면상에 출력
    
    let v_btns = document.querySelectorAll('button');
    let v_disp = document.querySelector('div');

    v_btns[0].addEventListener('click', function(){
        let v_ajax = new XMLHttpRequest();
        v_ajax.open('get', 'ajax/dummy.txt', true);

        v_ajax.onreadystatechange = function(){
        // v_ajax.onload = function(){ // 위와 같이 사용 가능

        // v_ajax.onprogress = function(){ // 사용 불가능 : 3과 200을 출력
        // v_ajax.onloadstart = function(){ // 사용 불가능 : 1과 0을 출력

            // console.log("onload일때 >> ", v_ajax.readyState, v_ajax.status)
            if(v_ajax.readyState == 4 && v_ajax.status == 200) {
                v_disp.innerText = v_ajax.responseText;
            }
        }
        v_ajax.send();
    });

    // JQ 방식
    /* $('button').eq(0).on('click', function(){
        let v_ajax = new XMLHttpRequest();
        v_ajax.open('get', 'ajax/dummy.txt', true);

        v_ajax.onreadystatechange = function(){
            if(v_ajax.readyState == 4 && v_ajax.status == 200) {
                $('div').text(v_ajax.responseText);
            }
        }
        v_ajax.send();
    }); */

</script>
</body>
</html>

 

결과 화면2 : ajax 버튼 클릭 시 dummy.txt 내용 출력

 

 

 

  • ajax로 csv 출력
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>ajax</button>
    <button>JSON가져오기</button>
    <div>출력영역</div>

<script src="../js/jquery-3.7.1.min.js"></script>
<script>
    // 버튼 눌렀을 때 AJAX로 dummy.txt에서 제공하는 응답데이터를 화면상에 출력
    
    let v_btns = document.querySelectorAll('button');
    let v_disp = document.querySelector('div');

    
    // CSV정보 AJAX로 가져오기
    // $('button').eq(0).on('click', function(){
    v_btns[1].addEventListener('click', function(){
        //1 XMLHttpRequest객체 생성
        let req = new XMLHttpRequest();

        //2 open(설정)
        req.open("get", "ajax/ajax.csv");

        //4 onreadystatechange readyState status responseText
        req.onreadystatechange = function(){
            if(req.readyState == 4 && req.status == 200) {
                console.log(req.responseText);
                f_csv(req.responseText);
            }
        }

        //3 send()
        req.send();
    });

    // css정보를 테이블 구조로 출력하기
    function f_csv(p_data) {
        // alert(p_data);
        let v_line = p_data.split("\r\n"); // 한 줄씩 정보 나누기

        let v_tbl = "<table border=1>";

        for(let i=0; i<v_line.length; i++) {
            v_tbl +="<tr>";
            let v_cell = v_line[i].split(",");
            console.log(v_cell);
            for(let j=0; j<v_cell.length; j++) {
                if(i<1) {
                    v_tbl += `<th>${v_cell[j]}</th>`;
                } else {
                    v_tbl += `<td>${v_cell[j]}</td>`;
                }
            }
            v_tbl += "</tr>";
        }
        v_tbl += "</table>";
        v_disp.innerHTML = v_tbl;
    }

</script>
</body>
</html>

 

결과 화면3 : CSV가져오기 버튼 클릭 시

 

 

 

  • ajax로 JSON 출력
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>JSON가져오기</button>
    <div>출력영역</div>

<script src="../js/jquery-3.7.1.min.js"></script>
<script>
    // 버튼 눌렀을 때 AJAX로 dummy.txt에서 제공하는 응답데이터를 화면상에 출력
    
    let v_btns = document.querySelectorAll('button');
    let v_disp = document.querySelector('div');


    v_btns[0].addEventListener('click', function(){
        let req = new XMLHttpRequest();

        req.open('get', './ajax/ajax.json');

        req.onreadystatechange = function(){
            if(req.readyState == 4 && req.status == 200) {
                // console.log(req.responseText);
                //string 형태로 가기에 object로 보내줘야함
                // json문자열 => js객체로 변환
                let jsonObj = JSON.parse( req.responseText );
                f_json(jsonObj);
            }
        }
        req.send();
    });

    let f_json = function(p_json) {
        // alert(typeof p_json); // object인 객체로 전송됨
        console.log(p_json);
        let v_tbl = "<table border=1>";
        v_tbl += "<tr><th>이름</th><th>종류</th><th>별명</th></tr>"; // 제목 하드코딩

        for(let i=0; i<p_json.length; i++) {
            v_tbl += "<tr><td>" + p_json[i].name + "</td>";
            v_tbl += `<td>${p_json[i].type}</td>`;
            v_tbl += `<td>${p_json[i].alias}</td></tr>`;
        }
        v_tbl += "</table>";

        v_disp.innerText = ""; // 영역 초기화
        v_disp.insertAdjacentHTML('beforeend', v_tbl); // 추가
    };

</script>
</body>
</html>

 

결과 화면4

 

 

=> 제일 상단 하드코딩 대신 코드로 대체

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>JSON가져오기</button>
    <div>출력영역</div>

<script src="../js/jquery-3.7.1.min.js"></script>
<script>
    // 버튼 눌렀을 때 AJAX로 dummy.txt에서 제공하는 응답데이터를 화면상에 출력
    
    let v_btns = document.querySelectorAll('button');
    let v_disp = document.querySelector('div');


    v_btns[0].addEventListener('click', function(){
        let req = new XMLHttpRequest();

        req.open('get', './ajax/ajax.json');

        req.onreadystatechange = function(){
            if(req.readyState == 4 && req.status == 200) {
                // console.log(req.responseText);
                //string 형태로 가기에 object로 보내줘야함
                // json문자열 => js객체로 변환
                let jsonObj = JSON.parse( req.responseText );
                f_json(jsonObj);
            }
        }
        req.send();
    });

    let f_json = function(p_json) {
        // alert(typeof p_json); // object인 객체로 전송됨
        console.log(p_json); // json object, js객체

        // 제목정보를 데이터의 key로 표시하기
        // Object라는 내장객체가 제공하는 keys(), values(), entries()
        let arrVal1 = Object.values(p_json)[0];
        console.log(arrVal1);
        let key = Object.keys(arrVal1);
        console.log(key);

        let v_tbl = "<table border=1>";
        // v_tbl += "<tr><th>이름</th><th>종류</th><th>별명</th></tr>"; // 제목 하드코딩
        v_tbl += `<tr><th>${key[0]}</th><th>${key[1]}</th><th>${key[2]}</th></tr>`;

        for(let i=0; i<p_json.length; i++) {
            v_tbl += "<tr><td>" + p_json[i].name + "</td>";
            v_tbl += `<td>${p_json[i].type}</td>`;
            v_tbl += `<td>${p_json[i].alias}</td></tr>`;
        }
        v_tbl += "</table>";

        v_disp.innerText = ""; // 영역 초기화
        v_disp.insertAdjacentHTML('beforeend', v_tbl); // 추가
    };

</script>
</body>
</html>

 

결과 화면5

 

 

 

  • ajax로 xml 출력
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>XML가져오기</button>
    <div>출력영역</div>

<script src="../js/jquery-3.7.1.min.js"></script>
<script>
    
    let v_btns = document.querySelectorAll('button');
    let v_disp = document.querySelector('div');

    v_btns[0].onclick = function(){
        let ajax = new XMLHttpRequest();
        ajax.open('get', './ajax/ajax.xml', true);
        ajax.onreadystatechange = function(){
            if(this.readyState == 4 && this.status == 200) {
                // XML형식의 문자열 데이터는 접근이 어려움(정보를 얻기 힘듦)
                // XML은 HTML과 같이 태그로 이루어졌기 때문에 DOM API의 활용이 가능하다
                console.log(typeof this.responseXML); // object
                f_xml(this.responseXML);
            }
        };
        ajax.send();
    };

    function f_xml(p_xml){
        console.log(p_xml);
        let v_friends = p_xml.querySelectorAll('friend');
        console.log(v_friends);

        let v_tbl = "<table border=1>";
        for(let i=0; i<v_friends.length; i++) {
            v_tbl += `<tr>`;
            
            let child = v_friends[i].children;
            // console.log(v_friends[i].children[0].innerHTML);

            for(let j=0; j<child.length; j++) {
                v_tbl += `<td>${child[j].innerHTML}</td>`;
            }

            v_tbl += `</tr>`;
        }

        v_tbl += "</table>";

        v_disp.innerHTML = v_tbl;
    }

</script>
</body>
</html>

 

결과 화면6

 

 

반응형
반응형

 

JSON (Java Script Object Notation, 자바스크립트 객체 표기법)

 

: XML의 대안으로 좀 더 쉽게 데이터를 교환하고 저장하기 위해 만들어진 텍스트 기반의 데이터 교환 표준 (=자바 스크립트 언어에서 유래)

 

- 특징 

1. JS의 리터럴 표현식을 활용해 간단한 포맷으로 데이터를 구분할 수 있는 문자열 포맷

2. 텍스트 기반이므로 사람이나 어떠한 프로그래밍 언어라도 데이터를 읽고 사용 가능

3. 네트워크를 사용하는 데이터 통신은 데이터를 byte형태로 전달한다.
4. 서버 <-> 클라이언트, 서버 <-> 어플리케이션에서 처리할 데이터를 주고 받을 때 쓰는 자료형식 중 대표적인 형식이 XML과 JSON이다.

5. 현재는 XML을 밀어내고 대표적인 데이터 전송 포맷으로 자리잡음

6. 구조화 된 데이터 표현을 위한 경량 데이터 교환 형식으로 key:value 포맷 형태를 사용한다
7. 항상 큰 따옴표로 묶어 사용하며 data값에서 역슬래시(\)와 큰 따옴표(")는 사용 불가하다

 

 

- 변환

자바 스크립트 객체 -> JSON

JSON  -> 자바 스크립트 객체

 

 

- 확장자 : .json

 

 

- JSON 형식

// JavaScript
{name : “홍길동“, addr : “대전“, tel : “010-1234-5678”}

// JSON object
{“name” : “홍길동“, “addr” : “대전“, “tel” : “010-1234-5678”}

// 배열
[ “홍길동“, “개나리“, “진달래”, “이도령" ]

// JSON object 배열
[{“name” : “홍 “, “addr” : “대전“, “tel” : “010-1234-5678”},
{“name” : “홍길 “, “addr” : “대전“, “tel” : “010-1234-5678”},
{“name” : “홍길동“, “addr” : “대전“, “tel” : “010-1234-5678”} ]

 

 

- JSON 메소드

메소드 설 명
JSON.stringify(myObj) 문자열로 변환 (서버로 전송 시)
JSON.parse(string, function) JavaScript 객체로 변환

 

 

 

JSON 예제

 

 

  • 자바스크립트 객체 => JSON문자열 포맷 변환 (stringify)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>JSON 변환 테스트</button>
    <div></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $('button').on('click',function(){

        // 리터럴 객체 생성
        // key의 타입은 string이므로 따옴표 사용 유무 상관없음
        let obj = {
            json    : "제이슨",
            "특징"  : "경량의 텍스트기반 데이터교환 표준으로 xml의 대안",
            형태    : "JS 리터럴 표현식을 활용한 간단한 문자열 포맷(\"key\":\"value\" )",
            메소드  : ["stringify()", "parse()"],
            기능    : {stringify:"JS객체를 JSON화", parse : "JSON문자열 데이터를 JS객체화"}
        };

        // 자바스크립트 객체 => JSON문자열 포맷 변환
        // JSON이라는 내장 객체를 제공하며 stringify()
        let jsonStr = JSON.stringify(obj);
        console.log( jsonStr, typeof jsonStr );

    });
</script>
</body>
</html>

 

결과 화면1

 

 

 

  • JSON문자열 포맷  => 자바스크립트 객체  변환 (parse)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>JSON 변환 테스트</button>
    <div></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $('button').on('click',function(){

        // 리터럴 객체 생성
        // key의 타입은 string이므로 따옴표 사용 유무 상관없음
        let obj = {
            json    : "제이슨",
            "특징"  : "경량의 텍스트기반 데이터교환 표준으로 xml의 대안",
            형태    : "JS 리터럴 표현식을 활용한 간단한 문자열 포맷(\"key\":\"value\" )",
            메소드  : ["stringify()", "parse()"],
            기능    : {stringify:"JS객체를 JSON화", parse : "JSON문자열 데이터를 JS객체화"}
        };

        // 자바스크립트 객체 => JSON문자열 포맷 변환
        // JSON이라는 내장 객체를 제공하며 stringify()
        let jsonStr = JSON.stringify(obj);
        console.log( jsonStr, typeof jsonStr );

        // JSON문자열포맷 ==> 자바스크립트 객체 변환
        // JSON.parse()
        let jsonObj = JSON.parse(jsonStr);
        console.log(jsonObj, typeof jsonObj);
    });
</script>
</body>
</html>

 

결과 화면2

 

 

+ 접근 방법

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <button>JSON 변환 테스트</button>
    <div></div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    $('button').on('click',function(){

        let obj = {
            json    : "제이슨",
            "특징"  : "경량의 텍스트기반 데이터교환 표준으로 xml의 대안",
            형태    : "JS 리터럴 표현식을 활용한 간단한 문자열 포맷(\"key\":\"value\" )",
            메소드  : ["stringify()", "parse()"],
            기능    : {stringify:"JS객체를 JSON화", parse : "JSON문자열 데이터를 JS객체화"}
        };

        let jsonStr = JSON.stringify(obj);
        let jsonObj = JSON.parse(jsonStr);

        console.log(jsonObj.json);
        console.log(jsonObj['형태']);
        console.log(jsonObj.메소드[0]);
        console.log(jsonObj.기능.parse);
    });
</script>
</body>
</html>

 

결과 화면3

 

 

반응형
반응형

 

콜백 함수와 체이닝

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<style>
img {
  width: 200px;
  position: relative;
}
#d1 {
  border: 2px solid yellow;
  height: 200px;
}
</style>
</head>
<body>
    <div id="d1">
        <img src="../images/chi1.jpg" alt="chi">
    </div>

<script src="../js/jquery-3.7.1.min.js"></script>
<script>
    $('#d1').on('click', function(){
        $('img').hide('slow');
        alert("숨겼음");
    });
</script>
</body>
</html>

 

결과 화면1 : alert 후 이미지가 숨겨짐

 

 

=> alert를 나중에 작동할 수 있게 변경함

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<style>
img {
  width: 200px;
  position: relative;
}
#d1 {
  border: 2px solid yellow;
  height: 200px;
}
</style>
</head>
<body>
    <div id="d1">
        <img src="../images/chi1.jpg" alt="chi">
    </div>

<script src="../js/jquery-3.7.1.min.js"></script>
<script>
    $('#d1').on('click', function(){
        $('img').hide('slow', function(){
            alert("숨겼음");
        });
    });
</script>
</body>
</html>

 

결과 화면2 : 이미지 숨겨진 후 alert 작동

 

 

 

동기 & 비동기

 

 

  • 1. 동기와 비동기란

동기(Synchronous)

: 요청에 대한 응답 완료시 다음 업무를 요청하는 방식

 

- 장점 : 직관적이며 설계가 쉽고 실행순서가 보장된다.
- 단점 : 실행중인 코드의 처리시간이 늘어나도 결과가 나올 때까지 대기해야 하는 작업중단(blocking)현상 발생

 


비동기(Asynchronous)

: 요청에 대한 응답 확인 전 다음 업무도 요청하는 방식


- 장점 : 데이터 처리 중 다른 작업이 가능하기 때문에 자원을 효율적으로 사용하며 불필요한 로딩을 줄일 수 있다
- 단점 : 설계가 어렵고 실행순서가 보장되지 않으므로 어떤 작업이 먼저 끝날지 알 수 없음

 

 

 

  • 2. 자바 스크립트의 동기적 흐름
<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>

    alert("1");
    (function(p_arg){alert(p_arg);})("2"); // 즉시 실행 함수
    function fnc(){alert("3")}
    fnc();
    console.log("4");

</script>

 

결과 화면3 : 1, 2, 3, 4 차례대로 출력됨

 

 

 

  • 3. 자바 스크립트의 비동기적 흐름
<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>

    alert("a"); // 우선 순위 높음
    function fnc1() {
        alert("b");
    }
    setTimeout(fnc1, 3000); // 대표적인 비동기함수인 타이머함수
    alert("c");
    $.get('text.txt', function(res){alert(res)}); // jQuery get방식 단축모드 AJAX(비동기통신)

</script>

 

 

test.txt

d Dit

 

결과 화면4 : a, c, d Dit, b 순으로 뜸

 

 

=> 시간을 가늠하기 위해 아래의 코드를 추가해 실행

 

 

<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>

    alert("a");
    function fnc1() {
        console.timeEnd('yujin'); // 실행시간을 가늠하기 위한 엔드
        alert("b");
    }
    setTimeout(fnc1, 3000);
    console.time('yujin'); // 실행 시간을 가늠하기 위한 스타트
    alert("c");
    $.get('test.txt', function(res){alert(res)});

</script>

 

결과 화면5 : 걸린 시간을 ms로 console창에 찍힘

 

 

 

  • 4. 비동기적 로직 제어를 위한 callback

콜백 함수 : 비동기로 작성된 함수를 동기 처리하기 위한 하나의 방법론
>> 비동기를 기본으로 하면서 일부 구간에서만 순차적인 처리가 필요할 때 많이 사용됨

 


ex) ① AJAX로 서버의 정보를 응답받기
② 응답받은 정보를 DB에 저장
③ 저장 직후 메인페이지로 이동 

로직 구현 시 >> 응답 시점을 모르는 비동기 처리를 제어하기 위한 방법으로 callback을 사용

 

 

<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>

    let a = $.get('test.txt'); // 비동기통신을 통해 요청에 대한 응답(dDit)을 받아 변수에 담음
    console.log(a.responseText + '를 db에 저장'); // undefined를 db에 저장
    setTimeout(function(){
        console.log(a.responseText + '를 DB에 저장');
    },1000);

</script>

 

결과 화면6 : 1초 뒤 setTimeout이 작동됨

 

 

 

  • 5. 콜백 지옥과 대체제 Promise(ES6)

비동기는 끝나는 시점이 정해지지 않고 처리결과를 콜백으로 받아 처리하는 구조
>> 콜백함수의 중복된 사용이 발생하며 그것을 Hello of callback이라고 부른다. 개선을 요청하여 Promise가 탄생되었다.

 


[Promise, 미래에 발생할 일이나 결과(약속)]
- 비동기 작업을 처리하고 결과를 반환하는 객체 (resolve, 해결 / reject, 거부)
- 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과값을 나타내는 객체

 


- 3개의 상태
pending 대기 : 객체 생성 초기단계 / 비동기 작업 중 / 결과 값은 아직 없는 상태
fulfilled 이행 : 비동기 작업 성공적으로 완료 / 결과 값이 있으며 사용 가능 상태
rejected 거부 : 비동기 작업 실패 / 에러 정보 등 추가정보를 제공

 

        
Promise객체를 반환받을 때 두개의 (해결 또는 이행/거부에 관한) 콜백함수를 같이 받음
이행 상태일 때는 then()으로 처리결과를 받음
거부 상태일 때는 catch()로 에러정보를 받음

 

 

<!DOCTYPE html>
<meta charset="UTF-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>

    function promiseFnc(p_arg) {
        return new Promise(function(res, rej) {
            if(p_arg) {
                res("이행상태에 따라 처기력과를 반환하는 함수를 통해 응답을 제공 >> " + p_arg);
            } else {
                rej("거부상태에 따라 에러정보를 반환 >> ");
            }
        });
    }

    promiseFnc("함수 호출").then(res => console.log(res)).catch(err => console.log(err));
    promiseFnc().then(res => console.log(res)).catch(err => console.log(err));

</script>

 

결과 화면7

 

 

반응형

'jQuery' 카테고리의 다른 글

[jQuery] 20장 Ajax  (0) 2024.02.27
[jQuery] 19장 JSON  (1) 2024.02.27
[jQuery] 17장 효과, 애니메이션  (0) 2024.02.27
[jQuery] 16장 필터링  (0) 2024.02.26
[jQuery] 15장 DOM 탐색  (0) 2024.02.26
1 2 3 4 5 ··· 8