팝업 화면에 대한 닫힘을 동기 방식으로 대기하는 기능에 대한 샘플화면이다.
자바스크립의 Promise 오브젝트를 사용하는 방법인 async, await 문법(ECMAScript (ECMA-262)을 사용한다.
동기 방식 API 함수를 호출하는 함수는 async function이어야하며, await 문법을 이용해서 동기 방식 API를 호출해야 한다.
동기 방식 API는 IE에서는 지원되지 않는다.
관련 API로 domodal, getscreentype이 있다.
관련 이벤트로 on_popupload, on_popupdestroy가 있다.
var SCREEN_BASE_DIR = "/HTML5/SCREEN/SYNC/"; // 화면 로드 이벤트 function screen_on_load() { factory.showconsoletrace(true); } /** * factory.loadpopup API로 로드한 팝업 화면이 로드가 완료되면 발생하는 이벤트 * * @param popup_screen 팝업 화면 인스턴스 오브젝트 * @param popup_name factory.loadpopup API 호출시 지정한 팝업 이름 */ async function screen_on_popupload(popup_screen, popup_name) { var log_prefix, popup_ret; log_prefix = "mainscreen:screen_on_popupload> "; factory.consoleprint(log_prefix + "start"); factory.consoleprint(log_prefix + "popup_name = " + popup_name); if (factory.isobject(popup_screen)) { factory.consoleprint(log_prefix + "screen = " + popup_screen.getscreenurl()); } // domodal 호출 여부 옵션 검사 if (this.chk_calldomodal.getcheck()) { factory.consoleprint(log_prefix + "screen type = " + popup_screen.getscreentype()); factory.consoleprint(log_prefix + "before WaitPopupUnload"); popup_ret = await WaitPopupUnload(screen, popup_name, popup_screen.getscreentype() == 0 ? false : true); factory.consoleprint(log_prefix + "after WaitPopupUnload"); factory.consoleprint(log_prefix + "popup_ret = " + popup_ret); } factory.consoleprint(log_prefix + "end"); } /** * 로드된 팝업 화면에서 unloadpopup API 호출로 인해서 팝업이 닫힐때 발생하는 이벤트 * * @param popup_screen 팝업 화면 인스턴스 오브젝트 * @param popup_name factory.loadpopup API 호출시 지정한 팝업 이름 * @param result 로드된 팝업 화면에서 unloadpopup API 호출시 전달한 파라미터 값 */ function screen_on_popupdestroy(popup_screen, popup_name, result) { var log_prefix; log_prefix = "mainscreen:screen_on_popupdestroy> "; factory.consoleprint(log_prefix + "start"); factory.consoleprint(log_prefix + "popup_name = " + popup_name); factory.consoleprint(log_prefix + "result = " + result); factory.consoleprint(log_prefix + "end"); } // "loadpopup" 버튼 이벤트 function btn_loadpopup_on_mouseup(objInst) { var log_prefix, ret, is_modal; log_prefix = "mainscreen:loadpopup> "; is_modal = this.chk_modalpopup.getcheck(); // 일반 화면을 모달/모달리스 팝업으로 비동기 방식 로드 factory.consoleprint(log_prefix + "before loadpopup"); ret = factory.loadpopupex("POPUP_SCREEN_ASYNC", SCREEN_BASE_DIR + "business_screen", "POPUP SCREEN ASYNC", false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, is_modal, screen, "POPUPSCREEN_EXTRADATA"); factory.consoleprint(log_prefix + "after loadpopup"); factory.consoleprint(log_prefix + "ret = " + ret); } // "loadpopupsync" 버튼 이벤트 async function btn_loadpopupsync_on_mouseup(objInst) { var log_prefix, popup_screen, ret, popup_ret, is_modal; log_prefix = "mainscreen:loadpopupsync_modal> "; is_modal = this.chk_modalpopup.getcheck(); // 일반 화면을 모달/모달리스 팝업으로 동기 방식 로드 factory.consoleprint(log_prefix + "before loadpopupsync"); ret = await factory.loadpopupsync("POPUP_SCREEN_SYNC", SCREEN_BASE_DIR + "business_screen", "POPUP SCREEN SYNC", false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, is_modal, screen, "POPUPSCREEN_EXTRADATA"); factory.consoleprint(log_prefix + "after loadpopupsync"); factory.consoleprint(log_prefix + "return = " + ret); // 팝업 이름을 기준으로 팝업 화면 인스터스를 구하여 화면 URL 로깅 popup_screen = factory.findpopup("POPUP_SCREEN_SYNC"); if (factory.isobject(popup_screen)) { factory.consoleprint(log_prefix + "screen = " + popup_screen.getscreenurl()); } // domodal 호출 여부 옵션 검사 if (this.chk_calldomodal.getcheck()) { factory.consoleprint(log_prefix + "before WaitPopupUnload"); popup_ret = await WaitPopupUnload(screen, "POPUP_SCREEN_SYNC", true); factory.consoleprint(log_prefix + "after WaitPopupUnload"); return popup_ret; } return ret; } // "loadportletpopup 버튼 이벤트 function btn_loadportletpopup_on_mouseup(objInst) { var log_prefix, ret; log_prefix = "mainscreen:loadportletpopup> "; // 포틀릿 화면을 모달 팝업으로 비동기 방식 로드 factory.consoleprint(log_prefix + "before loadportletpopup"); ret = screen.loadportletpopup("POPUP_PORTLET_ASYNC", SCREEN_BASE_DIR + "business_screen", "POPUP PORTLET ASYNC", false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, false, "POPUPSCREEN_EXTRADATA"); factory.consoleprint(log_prefix + "after loadportletpopup"); factory.consoleprint(log_prefix + "ret = " + ret); } // "loadportletpopupsync" 버튼 이벤트 async function btn_loadportletpopupsync_on_mouseup(objInst) { var log_prefix, popup_screen, ret, popup_ret; log_prefix = "mainscreen:loadportletpopupsync> "; // 포틀릿 화면을 모달 팝업으로 동기 방식 로드 factory.consoleprint(log_prefix + "before loadportletpopupsync"); ret = await screen.loadportletpopupsync("POPUP_PORTLET_SYNC", SCREEN_BASE_DIR + "business_screen", "POPUPPORTLET SYNC", false, XFD_BORDER_RESIZE, 0, 0, 200, 500, true, true, false, "POPUPSCREEN_EXTRADATA"); factory.consoleprint(log_prefix + "after loadportletpopupsync"); factory.consoleprint(log_prefix + "return = " + ret); // 팝업 이름을 기준으로 팝업 화면 인스터스를 구하여 화면 URL 로깅 popup_screen = screen.findportletpopup("POPUP_PORTLET_SYNC"); if (factory.isobject(popup_screen)) { factory.consoleprint(log_prefix + "screen = " + popup_screen.getscreenurl()); } // domodal 호출 여부 옵션 검사 if (this.chk_calldomodal.getcheck()) { factory.consoleprint(log_prefix + "before WaitPopupUnload"); popup_ret = await WaitPopupUnload(screen, "POPUP_PORTLET_SYNC", true); factory.consoleprint(log_prefix + "after WaitPopupUnload"); factory.consoleprint(log_prefix + "popup_ret = " + popup_ret); return popup_ret; } return ret; } /** * 팝업 화면이 닫히는 것을 동기 방식으로 대기 * * @param is_modal 모달 팝업 여부 * @param obj_screen 팝업 화면 대기 화면 인스턴스 * @param popup_name 팝업 화면 이름 * @param is_portlet_popup 포틀릿 팝업 여부 * * @returns 팝업 화면에서 unloadpopup API 호출시 전달된 파라미터 값 */ async function WaitPopupUnload(obj_screen, popup_name, is_portlet_popup) { var log_prefix, obj_extra_data, popup_screen; log_prefix = "mainscreen:WaitPopupUnload> "; // 팝업 화면 인스턴스를 구함 if (is_portlet_popup) { popup_screen = obj_screen.findportletpopup(popup_name); } else { popup_screen = factory.findpopup(popup_name); } if (!factory.isobject(popup_screen)) { return null; } // 팝업 화면에 대해서 domodal API를 호출하여, 팝업 화면이 닫힐 때까지 대기 // 팝업 화면에서 unloadpopup API 호출시 전달된 파라미터 값이 리턴값으로 설정됨 // domodal API 호출시 팝업 부모 화면의 "on_popupdestroy" 이벤트는 발생하지 않음 // domodal API를 호출하지 않으면, on_popupdestroy 이벤트를 통해서 // 팝업 화면에서 unloadpopup API 호출시 전달된 파라미터 값이 전달됨 factory.consoleprint(log_prefix + "before domodal"); popup_ret = await popup_screen.domodal(); factory.consoleprint(log_prefix + "after domodal"); factory.consoleprint(log_prefix + "popup_ret = " + popup_ret); return popup_ret; }