顯示具有 callback 標籤的文章。 顯示所有文章
顯示具有 callback 標籤的文章。 顯示所有文章

2022年9月28日 星期三

V20301 - 詢問使用者確認後,才往下執行 – callback 2 次

 目的: V20301 – 詢問使用者確認後,才往下執行 – callback 兩次

處理說明:


1>*.js 

 //[確認轉發工]
    function FM2AMM()
    {
        var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
        var cur_rec;        
        if (cur_recs.length == 0) {
            buttonModel.modelType = 0;
            mywarnalert('請先勾選要[確認轉發工]的資料!!');
        }
        else {
            var gridstore = Ext.getCmp('grid_Single').store;
           var Tmp_Msg = "確定將勾選的資料轉發工嗎?";
            Ext.Msg.confirm('確認', Tmp_Msg, callBackFunc);

           
function callBackFunc(id) {
                console.log("1 callBackFunc : 確定將勾選的資料轉發工嗎?");
                if (id == 'yes') {            

                    console.log("cur_recs.length:", cur_recs.length);            
var Tmp_DataAry = [];
var isOk = true;
var np = {};
var Tmp_Str = "";
for (let i = 0; i <= cur_recs.length - 1; i++) {
// console.log("i:", i);
cur_rec = cur_recs[i];
if (cur_rec.data["STATFM"].toString() != "A")
{
Tmp_Str = "交修件單號(" + cur_rec.data["FMNO"].toString() + ")單況必需為 A: 未發工<br> "
+ "才可轉發工 !!<br>"
+ "請點選[複製]鈕, 建立資料<br>"
+ "再發工<br>";
mywarnalert(Tmp_Str);
return ;
}

Tmp_DataAry.push(cur_rec.data);

} // end of for (let i=0,)

// 將目前子畫面的資料(Table)轉成 JSON字串

var Tmp_DataStr = JSON.stringify(Tmp_DataAry);

console.log("Tmp_DataStr:", Tmp_DataStr);

//詢問 "此筆資料來源為 AMM,請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號]?

var Tmp_isRPNOAF2AMMNO = "false";

var Tmp_Msg = "此筆資料來源為 AMM<br>"

+"請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號] ? <br>";

Ext.Msg.confirm('詢問', Tmp_Msg, callBackFunc1);
function callBackFunc1(id) {

console.log("2 callBackFunc1 : 此筆資料來源為 AMM, 請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號] ?");

if (id == 'yes') {

Tmp_isRPNOAF2AMMNO = "true";

}

var np = {};

np = {

DataStr: Tmp_DataStr,

isRPNOAF2AMMNO: Tmp_isRPNOAF2AMMNO,

};

Ext.Ajax.request({

method: "POST",

url: '../../api/V20301API/FM2AMM',

params: np,

//params: Ary_np,

async: false,

success: function (response, opts) {

console.log("0 response.responseText=", response.responseText);

var Tmp_Obj = Ext.decode(response.responseText);

console.log("1 Tmp_Obj=", Tmp_Obj);

if (Tmp_Obj["success"] == false) {

var Tmp_Rtn_Msg = "[轉待發工]失敗!! <br>"

+"請檢核<br> "

+ Tmp_Obj["Rtn_Msg"];

mywarnalert(Tmp_Rtn_Msg);

isOk = false;

}

}, //end of success

failure: function (response, opts) {

var Tmp_Obj = Ext.decode(response.responseText);

var Tmp_Rtn_Msg = "[轉待發工]失敗!! <br>"

+ "請檢核<br>"

+ Tmp_Obj["Rtn_Msg"];

mywarnalert(Tmp_Rtn_Msg);

isOk = false;

}

}) //end of Ext.Ajax.Request

if (isOk == true) {

mysuccessalert("確認轉發工成功!!");

//資料更新完成, 重新顯示資料

Ext.getCmp("btn_Show").fireHandler();

}

} //end of callBackFunc1

} // end if (id == 'yes')

} // end of callbackfunc

} //end of else {}

} // end of FM2AMM

2022年9月26日 星期一

V20301 -YN -先詢問訊息,確認後,才執行後續動作 - callback - myconfirmalert(Tmp_msg, callBackFunc);

 目的: V20103  先詢問訊息,確認後,才執行後續動作

處理說明: 1> Ext.Msg.confirm('提醒', '確認執行嗎?', callBackFunc);

                       function callBackFunc(id) {
                            if (id == 'yes') {
                  2>myconfirmalert(par_msg,CallBackfunc)        
                      myconfirmalert(Tmp_msg, callBackFunc);
                      function callBackFunc(id) {
                        if (id == 'yes') {
                            console.log("cur_recs.length:", cur_recs.length);                
                             var np = {}
                            np["TASKNO"] = cur_rec.data['TASKNO'].toString();



1>*.js 

Ext.getCmp("btn_copy").on('click', function (me, e, eOpts) {        
        var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
        var cur_rec;
        console.log("before copy_rec");
        //var copy_rec = Ext.create('Ext.data.Model', {});            
        var copy_rec;  //?? 如何產生另一 copy_rec 不和 cur_rec 相同
        var np = {};
        console.log("after copy_rec");
        if (cur_recs.length == 0) {
            buttonModel.modelType = 0;
            mywarnalert('請先勾選要複製的資料!!');
        }
        else {
            var gridstore = Ext.getCmp('grid_Single').store;
            //me.delMessage = "確定複製勾選的資料嗎?";
            var Tmp_msg="確定複製勾選的資料嗎?";
            Ext.Msg.confirm('提醒', Tmp_msg, callBackFunc);
            function callBackFunc(id) {
                if (id == 'yes') {

                    console.log("cur_recs.length:", cur_recs.length);                    
                    for (let i = 0; i <= cur_recs.length - 1; i++) {
                        console.log("i:", i);                        
                        cur_rec = cur_recs[i];                        
                        copy_rec = cur_rec;

                        console.log("0 cur_rec: ", cur_rec);
                        var Tmp_NEXT_FMNO = get_NEXT_FMNO();
                        var Tmp_cur_DT = DatetoStr(now, "Y/m/d");
                        var Tmp_MDDT = DatetoStr(copy_rec.data["MDDT"], "Y/m/d");
                        console.log("Tmp_NEXT_FMNO:", Tmp_NEXT_FMNO);
                        copy_rec.data["FMNO"]=Tmp_NEXT_FMNO;                        
                        copy_rec.data["BTDT"] = Tmp_cur_DT;        
                        copy_rec.data["MDDT"] = Tmp_cur_DT;        
                        copy_rec.data["STATFM"] = "A";        
                        copy_rec.data["DTSOR"] = "A";        
                        copy_rec.data["OSM"] = "";                    
                        console.log("1 cur_rec: ", cur_rec);
                        console.log("copy_rec: ", copy_rec);
                        //新增資料庫資料
                        Copy_FMNO(copy_rec);
                        //gridstore.add(copy_rec);
                        //資料庫新增完成後,  gridstore 新增該筆資料                        
                    } //  end of for (let i=0,)
                    //資料庫均刪除完成後, 才由 gridstore 移除資料
                    //for (let i = 0; i <= cur_recs.length - 1; i++) {
                    //    gridstore.remove(cur_recs[i]); //畫面上隱藏刪除列                     
                    //} //  end of for (let i=0,)
                    Ext.getCmp('btn_Show').fireHandler();
                    //Ext.getCmp('grid_Single').getView().refresh();
                    buttonModel.modelType = 0;
                }  // end    if (id == 'yes')             
            }  // end of callbackfunc
        }  //end of else {}       
    }
    );



2>V30702B.js 
cur_rec = cur_recs[0];
        var Tmp_msg = "結案後<br>"
                                 +"目前簽入中的派遣單單況將自動簽出<br>"
                                 +"確定執行[結案]嗎 ?<br>"
                                 +"(地裝派遣單號: " + cur_rec.data['TASKNO'].toString() + ")<br>";
        //Ext.Msg.confirm('提醒', Tmp_msg, callBackFunc);
        myconfirmalert(Tmp_msg, callBackFunc);
        function callBackFunc(id) {
            if (id == 'yes') {
                console.log("cur_recs.length:", cur_recs.length);                
                var np = {}
                np["TASKNO"] = cur_rec.data['TASKNO'].toString();
                var Tmp_url = '../../api/V30702BAPI/UPDATE_STA';
                var Tmp_RtnStr = getUrlStr(Tmp_url, np, "結案處理 - 單況更新");
                if (checkRtnOK(Tmp_RtnStr)) {
                    mysuccessalert(Tmp_RtnStr, function () {
                        Ext.getCmp('btn_Show').fireHandler();  //重新顯示 Master資料
                    })                    
                }




2022年8月31日 星期三

JS Callback function - function 的執行順序

 目的 :  認識 callback function 的定義及用法

處理說明:  JavaScript 是一個「非同步」的語言,
當我們執行程式時, for 迴圈並不會等待處理作業(statement)結束後才繼續
而是在執行階段就一口氣將statement執行完

一. callback function 的定義:  call function , 只有滿足某個條件(event 發生時)才會被執行

    Callback function 跟一般的函式沒什麼不同, 差別在於被呼叫執行的時機

     Office.addEventListener( '電話響', function(){ /* 接電話 */ }, false);

Callback function就是「把函式當作另一個函式的參數,透過另一個函式來呼叫它

Ex1>   window.setTimeout( function(){ ... }, 1000);
Ex2>
  var handler = function() { /* 接電話 */ }; 
  Office.addEventListener( '電話響', handler, false);
Ex3:
var funcA = function(){
  console.log('function A');
};

var funcB = function(){
  console.log('function B');
};
funcA();
funcB();

         -->  先印  function A  , 再印 function B

Ex4:

         var funcA=function {
                   window.setTimeout(function(){  console.log('function A'); }, 
                    Math.random()*1000);
         }

         var funcB=function {
                   window.setTimeout(function(){console.log('function B'); }, 
                    Math.random()*1000);
         }
         funcA();
         funcB();
        --> 不確定 function A / function B 先印

Ex5: 確保 function A 先印, 再印 function B
         var funcA=function(par_callback) {
                   window.setTimeout(function(){
                    console.log('function A'); 
                    if (typeof par_callback="function"){
                        par_callback();  
                    }
                    }, 
                    Math.random()*1000);
         };
         var funcB=function(){
               window.setTimeout(function(){
                    console.log('function B'); 
                    }, 
                    Math.random()*1000);
         };
       funcA(funcB);
  
       --> 無論 funcA 在執行的時候要等多久, 
     funcB 都會等到 console.log('function A'); 之後才執行。


Ex6 : 在五秒鐘之內,每秒鐘依序透過 console.log 印出: 0 1 2 3 4

          for (var i=0;i<5;i++){
               window.setTimeout(function(){   console.log(i);  }
                    ,1000*i);
           };
           //執行結果 : 5 5 5 5 5  

--> JavaScript 是一個「非同步」的語言,執行程式時, 
   for迴圈並不會等待處理作業(statement , window.setTimeout )結束後才繼續
      而是在執行階段就一口氣將statement執行完              
--> 切分變數(i)有效範圍的最小單位是 "function"
--> 因為函式未宣告變數 i , 所以每次執行 console.log(i); 的 i 變數是去函式「外層」取得
      因 function() 內未宣告 var i, 所以會在函式外層取得 (此時for迴圈已跑完 i=5) , 所以印出 5
      for(var i =0; i<5;i++)   --> 宣告 i 為全域變數


二.IIFE(Immediately Invoked Function Expression, IIFE)

    一般宣告方式:  doit(x);
    IIFE宣告方式:  函式宣告當下即呼叫 , 傳入參數 i , 即傳入當時的 i 值(0,1,2,3,4,5)
           (function doit(x){ console.log(x);} ) (i)

--> for (var i=0;i<5;i++) 
          (function doit(x){ console.log(x);} ) (i);