메뉴 건너뛰기

2021.03.25 16:15

ajax 동기화 처리하기

조회 수 452 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

동기화가 필요한 코드

아래의 코드는 ajax를 통해 로그인 여부 확인 후 로그인이 안된 경우 dwg 확장명을 가진 파일이 다운로드 안되도록 하는 코드이다. 실제 다운로드시 서버 단에서 한번 더 체크하는 부분은 별도로 있다.

 

수정전

아래처럼 작성한 경우 비동기 처리되어 로그인 여부 확인이 뒤늦게 이루어져서 "다운로드 권한이 없습니다." 라는 메시지가 의도한 대로 잘 작동되지 않는다.

 


/**
 * 로그온 여부 확인
 * @returns {Boolean}
 */
function isLogon() {
    //데이터 요청
    $.ajax({
        url : contextPath+'/main/isLogon.ajax',
        type : 'POST',
        dataType : 'json',
        contentType : 'application/json; charset=UTF-8',
        success : function(result) {
            //console.log("result : "+JSON.stringify(result));
            //console.log("basicInfoList : "+result.basicInfoList.length);
            return result;
        },
        error : function(request,status,error) {
            console.log("code:"+request.status+"\n\n"+ "message:" + request.responseText + "\n\n"+"error:"+error);
            //alert($(request.responseText.replace(/(\r\n|\n|\r)/gm,"")).text());
            //alert("처리에 실패하였습니다.\ncode:"+request.status+"\n"+"error:"+error);
        },
        complete : function() {
        }
    });
}

$(document).ready(function() {
    /**
     * 파일 다운로드 처리
     */
    $(document).on('click', '.down', function(){
        //로그인 시에만 다운로드 처리
        var ext = ($(this).text().split("."));
        //로그인 여부와 확장자 확인하는 부분
        if (isLogon() == false && ext[ext.length-1].toLowerCase() == "dwg") {
            //로그인이 안되었고 확장자가 dwg라면
            alert("다운로드 권한이 없습니다.");
        } else {
            var fileSn = $(this).data("filesn");
            var seq = $(this).data("seq");
            window.open(contextPath+"/main/filedown.do?seq="+seq+"&fileSn="+fileSn);
        }
    });
});

 

그래서 $.ajax(); 의 async 속성 사용으로 뭔가 방법을 찾을수 있을까 생각 했지만 async는 deprecated 되었다고 한다. async : false로 설정시 아래의 오류가 발생하였다.

파이어폭스에서... 메인 쓰레드에서의 동기화된 XMLHttpRequest는 사용자 경험에 안좋은 영향을 미치기 때문에 더이상 사용하지 않습니다. 더 자세한 사항은 http://xhr.spec.whatwg.org/ 를 참고해 주십시오.

크롬에서... [Deprecation] Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check https://xhr.spec.whatwg.org/.

 

수정후

이번엔 조금 다른 병식을 찾아서 적용해 보았다. 이번엔 의도한 대로 작동이 잘 되었다.

 


/**
 * 로그온 여부 확인
 * @returns {Boolean}
 */
function isLogon() {
    //데이터 요청
    var pormise = $.ajax({
        url : contextPath+'/main/isLogon.ajax',
        type : 'POST',
        //data : JSON.stringify(data),
        //async : false, //deprecated
        dataType : 'json',
        contentType : 'application/json; charset=UTF-8',
        success : function(result) {
            //console.log("result : "+JSON.stringify(result));
            //console.log("basicInfoList : "+result.basicInfoList.length);
        },
        error : function(request,status,error) {
            //console.log("code:" + request.status+"\n\n" + "message:" + request.responseText + "\n\n"+"error:"+error);
            //alert($(request.responseText.replace(/(\r\n|\n|\r)/gm,"")).text());
            //alert("처리에 실패하였습니다.\ncode:"+request.status+"\n"+"error:"+error);
        },
        complete : function() {
        }
    });
 
    return pormise;
}

$(document).ready(function() {
    /**
     * 파일 다운로드 처리
     */
    $(document).on('click', '.down', function(){
        var ext = ($(this).text().split("."));
        var fileSn = $(this).data("filesn");
        var seq = $(this).data("seq");
        var pormise = isLogon();
        var sessionOn = false;

        //jqXHR.done(function( data, textStatus, jqXHR ) {});
        //jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
        //jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { });
        
        pormise.done(function(result){
            sessionOn = result;
            //console.log(result);
         
            //로그인 여부와 확장자 확인하는 부분
            if (sessionOn == false && ext[ext.length-1].toLowerCase() == "dwg") {
                //로그인이 안되었고 확장자가 dwg라면
                alert("다운로드 권한이 없습니다.");
            } else {
                window.open(contextPath+"/main/filedown.do?seq=" + seq + "&fileSn=" + fileSn);
            }
        });
        //pomise.fail(function(){ ... }); //아직 테스트 못해봄
        //pomise.always(function(){ ... }); //아직 테스트 못해봄
    });
});
 

  1. No Image 26Mar
    by
    2021/03/26 Views 238 

    foreach문

  2. No Image 26Mar
    by
    2021/03/26 Views 322 

    항상 최신버전으로 사용하기

  3. No Image 26Mar
    by
    2021/03/26 Views 1406 

    selectbox multiple 선택한 값들 submit 해서 받기

  4. No Image 26Mar
    by
    2021/03/26 Views 941 

    DateTimepicker ( Timepicker + Datepicker )

  5. No Image 26Mar
    by
    2021/03/26 Views 267 

    라디오 버튼 선택값 가져오기

  6. No Image 26Mar
    by
    2021/03/26 Views 760 

    간단한 스크롤 따라 움직이는 메뉴 만들기

  7. No Image 26Mar
    by
    2021/03/26 Views 1538 

    datepicker, onclick 이벤트시에 한번에 뜨게 하기

  8. No Image 25Mar
    by
    2021/03/25 Views 428 

    Cesium에서 canvas 화면 center 지점의 좌표 취득

  9. No Image 25Mar
    by
    2021/03/25 Views 684 

    모달 띄우는 코드

  10. No Image 25Mar
    by
    2021/03/25 Views 345 

    javascript, jQuery에서 루프 돌리기 예 (for, forEach, each)

  11. No Image 25Mar
    by
    2021/03/25 Views 191 

    jQuery 사용자 정의 속성이 잘 반영되지 않은 경우

  12. No Image 25Mar
    by
    2021/03/25 Views 373 

    최초 접속시 css와 script가 로딩되지 않을때

  13. No Image 25Mar
    by 조쉬
    2021/03/25 Views 452 

    ajax 동기화 처리하기

  14. No Image 25Mar
    by
    2021/03/25 Views 275 

    CSS로 요소에 대한 클릭 등 이벤트 발생을 막고 싶을 때

  15. No Image 25Mar
    by
    2021/03/25 Views 406 

    목록의 체크 선택/해제에 따라 [전체선택] 체크박스를 체크하거나 해제하기

  16. No Image 25Mar
    by
    2021/03/25 Views 13711 

    Ajax를 통해 전송된 데이터를 Controller에서 List 객체로 받기

  17. No Image 25Mar
    by
    2021/03/25 Views 226 

    radio 제어하기

  18. No Image 25Mar
    by
    2021/03/25 Views 277 

    모든 링크를 읽어들여 기존의 태그 뒤에 새창열기 태그를 추가하기 예

  19. No Image 25Mar
    by
    2021/03/25 Views 274 

    jQuery로 접속 주소(URL) 알아내기

  20. No Image 25Mar
    by
    2021/03/25 Views 269 

    jquery 사용자정의 속성의 사용

Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved