2025年8月20日 星期三

V20305E: 程序1-->程序2-->程序3 - -JavaScript 的用法 async & await – 並包成 try {..} catch{..} 顯示錯誤訊息

 目的: V20305E: 程序1-->程序2-->程序3   
          -JavaScript 的用法 async & await – 並包成 try {..} catch{..} 顯示錯誤訊息

處理說明:  1> 程序1-->程序2-->程序3   - 每一程序執行OK,才執行下一程序
                        將function 包成 async 及 await  - 並利用 try{..} catch {..} - 顯示錯誤訊息

async function CALL_V20305_ALL() {
    try {
        await CALL_STEP1();
        await CALL_STEP2();
        await CALL_STEP3();
        mywarnalert("成功_finally:CALL_V20305_ALL -完成");
} //end of try
catch (err) {
        mywarnalert(err);
    }
}   // end of  async CALL_V20305_ALL
 
                   2>程序1 :
async function CALL_STEP1() {
try {
Ext.util.Cookies.set("Rtn_Msg", "");
await CHECK_V20305_TEST1(true);
Ext.util.Cookies.set("Rtn_Msg", "");
await CHECK_V20305_TEST2(true);
Ext.util.Cookies.set("Rtn_Msg", "");
await CHECK_V20305_TEST3(true);
} //end of try
catch (err) {
  throw new Error(err); //若有 throw Error ,則不會再往下執行 --> 會自動加 Error:
}
                      } // end of CALL_STEP1

             3> await 函式 : 必需包成 Promise
function CHECK_V20305_TEST1(success) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (success) {
                resolve({ data: '這是伺服器回傳的資料 1' });  //成功傳回資料
            } else {
                reject('資料載入失敗_reject 1');   //會自動發出 throw exception      
            }
        }, 1000); 
})
}



1>*.js
async function CALL_V20305_ALL() {
    try {
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CALL_V20305_TEST();
        console.log("CHECK_V20305_TEST() 完成!!: ");
        await CALL_V20305_UPDATE();
        console.log("CHECK_V20305_UPDATE 完成!!: ");        
        console.log("成功_finally:CALL_V20305_ALL -完成");
        mywarnalert("成功_finally:CALL_V20305_ALL -完成");
    }  //end of try
    catch (err) {
        console.log("錯誤_CALL_V20305_ALL:" + err);
        mywarnalert(err);
    }

async  function CALL_V20305_TEST() {    
    try {
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CHECK_V20305_TEST1(true);   //檢核資枓, 若沒問題 ,才執行 TEST2 
        console.log("CHECK_V20305_TEST1 completed: ");
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CHECK_V20305_TEST2(true);   //檢核資枓, 若沒問題 ,才執行 TEST3
        console.log("CHECK_V20305_TEST2 completed: ");
        Ext.util.Cookies.set("Rtn_Msg", "");
        await CHECK_V20305_TEST3(true);   
        console.log("CHECK_V20305_TEST3 completed: ");
        console.log("成功_finally:CALL_V20305_TEST -完成");
        //mywarnalert("成功_finally:CALL_V20305_TEST -完成");
    }  //end of try
    catch (err) {
        throw new Error(err);  //若有 throw Error ,則不再往下執行 - throw new Error(..)會自動加 Error:
    }    
}   // end of CALL_V20305_TEST

function CHECK_V20305_TEST1(success) {
    return new Promise((resolve, reject) => {
        //setTimeout(() => {
        //    if (success) {
        //        resolve({ data: '這是伺服器回傳的資料 1' });
        //        console.log("CHECK_V20305_TEST1 - resolve");              
        //    } else {
        //        reject('資料載入失敗_reject 1');
        //        console.log("CHECK_V20305_TEST1 - reject");
        //        //throw new Error('資料載入失敗_throw');
        //    }
        //}, 1000);
        var Tmp_isok = true;
        var Tmp_DataAry = [];
        for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
            cur_rec = CHK_PK_OBJ.ALL_LIST[i];
            Tmp_DataAry.push(cur_rec);
        }  //end of for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
        var Tmp_DataAryStr = JSON.stringify(Tmp_DataAry);
        var np = {};
        np["DataArySTr"] = Tmp_DataAryStr;
        //CHECK_V20305E_1  -  檢核交修單號已有工時/開放提料/TLS已有請料未提出記錄( CSM_AR,CSM_AF,CSM_UOCD)
        Tmp_url = '../../api/V20305EAPI/CHECK_V20305E_1';
        Ext.getCmp('s_form').submit({
            method: "POST",
            url: Tmp_url,  //更新資料庫單況            
            standardSubmit: true,
            params: np,
            async: false,
        });  //end of Ext.Ajax.Request               

        var mask = new Ext.LoadMask(Ext.getBody(), {
            msg: '[請料提出]鈕,資料檢核中_1, 請稍待...'
        });
        mask.show();//使用 mask 需手動呼叫show() 方法下            
        var timer = setInterval(function () {
            var r = r_cookies('Rtn_Msg');
            console.log("cookies Rtn_Msg =", r);
            //若有傳回值,則執行下一步驟
            if (!checkisnull(r)) {
                mask.hide();
                clearInterval(timer);
                if (r.indexOf("錯誤") > -1) {
                    r = r.replace(/\r\n/g, "<br>"); //置換所有  /r/n  --> <br>
                    console.log("CHECK_V20305E_1  failure !! ")
                    reject(r);   //產生錯誤訊息
                    Tmp_isok = false;
                    //return r;  //若有錯誤,則顯示錯誤訊息, 不再執行下一步騳
                }
                if (r.indexOf("成功") > -1) {
                    console.log("CHECK_V20305E_1  ok !! ")
                    resolve(r); // TEST OK
                }
            }  //end of   if (!checkisnull(r)) {
        }, 1000)  // end of timer
    });  // end of new Promise
}

沒有留言:

張貼留言