JavaScript 콜백 함수의 활용


JavaScript 에서는 콜백 함수를 아주 쉽게 구현할 수 있고 


아주 강력합니다.

특히 AJAX요청과 함께 사용하면 정말 강력한데요.

예를 들어, AJAX요청을 해서 어떤 정보를 가져와

그 가져온 정보로 무엇인가를 처리해주고 싶습니다.

하지만 AJAX특성상 서버의 응답도 영향이 있기 때문에

같은 요청도 같은 컴퓨터일지라도 네트워크 환경 등 여러가지 변수 때문에 반응 속도가 천차만별입니다.

따라서 setTimeout 을 이용한다거나 여러가지 다른 방법도 있겠지만

보다 확실한 방법은 콜백 함수를 이용하는 방법입니다.

콜백함수를 이용하게 되면

"어, 나 이 작업 다 끝났으니까 뭐 할 꺼 있으면 해"

라고 메시지를 전달함으로써 확실히 가져온 데이터를 가지고 처리를 할 수 있게 됩니다.

이제 예제 소스를 보여드리겠습니다.

var getSum = function( callback ) { $.getJSON("/ajax/getInfo", function( data ) { var sum = data.number + data.people; if( typeof callback === "function" ) { callback( sum ); } }); }; getSum(function(sum) { alert( sum ); });

이렇게 해주게 되면 getSum이란 함수를 호출했을 때 ajax 로 값을 가져와 어떤 값들을 처리해서 그 결과값을 

콜백 함수로 보내줄 수도 있고 딱히 콜백함수를 통해 보내주는 parameter가 없더라도 콜백함수를 호출해

순차적으로 일을 처리할 수 있게 됩니다. 

저 같은 경우에는 Google Maps JavaScript SDK 를 할 때 많이 유용하네요.

또 여러가지 제가 정의한 함수들끼리 데이터 처리를 할 때 어떤 함수의 처리가 반드시 어떤 함수의 처리보다 

선행되어야 한다거나 그런 경우에 많이 유용한 것 같네요.  





적용 예제)


호출부..


/**

 * 편성표 등록 에피소드 리스트 DRAG 이벤트

**/

function fn_EpisodeSortEvent() {

$("#scheduleBody").sortable({

revert : false

, start : function(event, ui) {

startIndex = $("#scheduleBody li").index(ui.item);

}

, stop : function(event, ui) {

if($("#normalTab").attr("class") == 'active'){

console.log("vod");

// VOD 헤더값 재생시간 입력

// 1.fn_getVodUrl(에피소드아이디와,콜백함수)호출

fn_getVodUrl($(ui.item).find("input:hidden[name=original_episode_id]").val(), function(result){    

// 2.콜백으로 받은후 fn_getVodDuation(받은값(URL),콜백함수)호출

    fn_getVodDuation(result,function(response){ 

console.log("재생시간 : "+response);    // 값 확인

$(ui.item).find("input:hidden[name=duration]").val(Math.floor(response));

console.log("재생시간 : " + $(ui.item).find("input:hidden[name=duration]").val());

var inHtml = "";

inHtml += "<table cellspacing=\"0\" cellspadding=\"0\"><tr>";

inHtml += "<td width=\"5%\"><input type=\"checkbox\" name=\"setStartTime\" onClick=\"javascript:checkboxOnlyOne(this)\" /></td>";

inHtml += "<td width=\"15%;\">";

inHtml += "<input type=\"text\" id=\"programming_start_time\" name=\"programming_start_time\" value=\"00:00:00\" style=\"width:45px; font-size:10px\" />";

inHtml += "<input type=\"hidden\" id=\"programming_end_time\" name=\"programming_end_time\" value=\"\" />";

inHtml += "</td>";

inHtml += "<td width=\"10%;\">" + $(ui.item).find("input:hidden[name=grade_name]").val() + "</td>";

inHtml += "<td class=\"txtlimit\" width=\"28%;\">" + $(ui.item).find("input:hidden[name=subtitle]").val() + "</td>";

inHtml += "<td width=\"15%;\">" + fn_StartTime($(ui.item).find("input:hidden[name=duration]").val()) + "</td>";

inHtml += "<td width=\"20%;\">";

inHtml += "<select id=\"streaming_flag\" name=\"streaming_flag\">";

inHtml += "<option value=\"1\">시간재생</option>";

inHtml += "<option value=\"0\">순차재생</option>";

inHtml += "</select>";

inHtml += "</td>";

inHtml += "<td width=\"10%;\"><img src=\"images/trash_16x16.gif\" onclick=\"fn_ScheduleRemove(this);\" /></td>";

inHtml += "</tr></table>";

inHtml += fn_GetScheduleHidden($(ui.item));

$(ui.item).html(inHtml);

});

});

} else {

console.log("adv");

var inHtml = "";

inHtml += "<table cellspacing=\"0\" cellspadding=\"0\"><tr>";

inHtml += "<td width=\"15%;\">";

inHtml += "<input type=\"text\" id=\"programming_start_time\" name=\"programming_start_time\" value=\"00:00:00\" style=\"width:45px; font-size:10px\" />";

inHtml += "<input type=\"hidden\" id=\"programming_end_time\" name=\"programming_end_time\" value=\"\" />";

inHtml += "</td>";

inHtml += "<td width=\"10%;\">" + $(ui.item).find("input:hidden[name=grade_name]").val() + "</td>";

inHtml += "<td class=\"txtlimit\" width=\"33%;\">" + $(ui.item).find("input:hidden[name=subtitle]").val() + "</td>";

inHtml += "<td width=\"12%;\">" + fn_StartTime($(ui.item).find("input:hidden[name=duration]").val()) + "</td>";

inHtml += "<td width=\"20%;\">";

inHtml += "<select id=\"streaming_flag\" name=\"streaming_flag\">";

inHtml += "<option value=\"1\">시간재생</option>";

inHtml += "<option value=\"0\">순차재생</option>";

inHtml += "</select>";

inHtml += "</td>";

inHtml += "<td width=\"10%;\"><img src=\"images/trash_16x16.gif\" onclick=\"fn_ScheduleRemove(this);\" /></td>";

inHtml += "</tr></table>";

inHtml += fn_GetScheduleHidden($(ui.item));

$(ui.item).html(inHtml);

}

}

});

fn_EpsoideDragEvent();

}









// 1.토큰값붙은 VOD URL 값 체크

function fn_getVodUrl(ep_id, callback){

$.ajax({

url: "https://예제.....1.0.0&os=Android&developer-key=516d644666317a3f206a682e456b5f42",

dataType: 'jsonp',

success: function(data) {

// 인코딩

var param = encodeURIComponent(data["Data"]);

$.ajax({

url: "https://p2-api-v1예제....ode-media/" + ep_id + "?token=" +param

, dataType: 'jsonp'

, success: function(data) {

var resCnt = data["Data"].length - 1;

var resValue = data["Data"][resCnt]["Id"];

if (resValue == null || resValue == "") {

alert("미디어 회차 아이디 획득 실패~~");

return;

}

$.ajax({

url: "https://예제.....dia-streaming/" + resValue + "?protocol=HLS&token=" + param

 , dataType: 'jsonp'

 , success: function(data) {

 var resultUrl = data["Data"]["Url"];

 callback(resultUrl); //  callBack  

 },

 error: function(xhr) {

 console.log('미디어 회차 아이디 획득 실패 - ', xhr);

}

});

},

error: function(xhr) {

 console.log('미디어 회차 아이디 획득 실패 - ', xhr);

}

});

},

error: function(xhr) {

 console.log('token 생성 실패 - ', xhr);

 return;

}

});

}



// 2. URL 값으로 헤더값 파싱.

function fn_getVodDuation(url,callback){

$("#vodDurationCheckTime").val(url);

$.ajax({

type : "post"

, async : false

, contentType : "application/x-www-form-urlencoded;charset=UTF-8"

, url : "vodRuntimeValue.do?"

, data : $("form[name=cpScheduleForm]").serialize()

, dataType : "json"

, success : function(response) {

callback(response.vodDuration);

}

});

 

 

 

******************************

자바스크립트 활용 콜백함수.

http://kanetami.tistory.com/entry/자바스크립트코어-콜백함수-callback





'knowledge' 카테고리의 다른 글

함수의 아규먼트와 파라미터의 차이 프로그래밍 이야기 2012/11/10 13:47  (0) 2014.06.02
Encoding  (0) 2014.04.08
http / https  (0) 2014.04.08
COOKIE , Session  (0) 2014.04.08
XML  (0) 2014.04.08

아규먼트(argument) 와 파라미터(parameter) 흔히들 구분하지 않고 사용한다.

하지만 이 둘은 분명히 차이가 있다.


PARAMETER란?


한글 그대로 번역하면 '매개변수'란 뜻이다. 즉,


함수를 정의 할 때

외부로부터 받아들이는 임의의 값을 의미한다.

가령 

function f(x,y){

return x+y;

};

에서 x,y가 파라미터라고 할수 있다.

 

 

그럼 ARGUMENT란?

우리말로는 '인수' 라고 번역되는데,

함수를 호출할 때 이 때 사용하게 되는 일련의 값들을 아규먼트라고 부른다.

예컨대 위에 파라미터의 예를 들었던 함수를 호출한다고 하면,

f(3,4);

에서 3,4등이 아규먼트이다.


즉, '파라미터의 값으로 아규먼트 3과 4를 대입하였다'

라는 의미가 성립하는것이다.


이처럼 파라미터와 아규먼트는 분명 같은위치에 있지만 다른의미로 쓰이는 것을 알수 있다.

 

 

 

'knowledge' 카테고리의 다른 글

Callback  (0) 2014.09.12
Encoding  (0) 2014.04.08
http / https  (0) 2014.04.08
COOKIE , Session  (0) 2014.04.08
XML  (0) 2014.04.08

+자바URL인코딩+

String URL = "www.myhome.com/";

String subURL = "한글값";

String thirdURL = "/index";

sbuURL =  URLEncoder.encode(subURL, "UTF-8");

URL = URL + subURL + thirdURL;

// URL 처리

URL 인코딩을 통해 '한글값' 만을 인코딩 해준다.

여기서 주의할점은 특수문자인 . _ - * 4가지는 변환에서 제외된다는 점이다. 따라서 인코딩될 값이 저 문자들이 포함될 경우 인코딩 후에도 특수문자들만은 변환되지 안은채 반영되므로 URL 보낼때 엉뚱한 주소로 찾아가는 경우가 있다. 

(경험상 / 특수문자도 변환되지 않는걸로 안다.)





+자바스크립트URL인코딩+


자바스크립트에서 지원하는 url encode / url decode 함수는 3가지가 있다. 


encodeURI() / decodeURI()

최소한의 문자만 인코딩한다. 예를들어 ;!@#$ 와 같은 문자는 인코딩 하지 않는다.

encodeURI('ABC가나다!@#htt://abc.com');

ABC%EA%B0%80%EB%82%98%EB%8B%A4!@#htt://abc.com

**encodeURI() 는 ~!@#$&*()=:/,;?+' 을 인코딩하지 않는다.


encodeURIComponent() / decodeURIComponent()

encodeURI() 가 특수문자를 인코딩 하지 않기 때문에 http:// 와 같은 주소전체를 인코딩할때 사용하는 url encode 함수이다

encodeURIComponent('ABC가나다!@#htt://abc.com');

ABC%EA%B0%80%EB%82%98%EB%8B%A4!%40%23htt%3A%2F%2Fabc.com

**encodeURIComponent() 는 ~!*()' 을 인코딩 하지 않는다.


escape() / unescape()

한글은 유니코드(%u0000) 형태로 변환한다.

encodeURI() 와 encodeURIComponent() 의 중간정도의 치환 범위를 갖는다.

escape('ABC가나다!@#htt://abc.com');

ABC%uAC00%uB098%uB2E4%21@%23htt%3A//abc.com

escape() 는 @*/+ 을 인코딩 하지 않는다.

'knowledge' 카테고리의 다른 글

Callback  (0) 2014.09.12
함수의 아규먼트와 파라미터의 차이 프로그래밍 이야기 2012/11/10 13:47  (0) 2014.06.02
http / https  (0) 2014.04.08
COOKIE , Session  (0) 2014.04.08
XML  (0) 2014.04.08

1

'knowledge' 카테고리의 다른 글

함수의 아규먼트와 파라미터의 차이 프로그래밍 이야기 2012/11/10 13:47  (0) 2014.06.02
Encoding  (0) 2014.04.08
COOKIE , Session  (0) 2014.04.08
XML  (0) 2014.04.08
LocalStorage (Web Storage)  (0) 2014.04.08

+ Recent posts