1. 程式人生 > >Promise使用筆記~~

Promise使用筆記~~

至從ES6(ES2015)正式規範之後,Promise收到高度重視,一直沒時間小結一波,今兒抽空整理下好東西Promise!

基本所有瀏覽器都支援Promise,所以放心大膽使用!

首先,控制檯先列印下Promise是什麼東西,如下圖所示:

Promise其實是一個建構函式,裡面包含了很多行為方法(race,reject,resolve等),在prototype原型上then、catch等回撥方法!

使用場景類似APAB前臺Model操作互動:

var oModel = new sap.ui.model.odata.ODataModel(
	"/sap/opu/odata/SAP/ZGS_ZICERP_F4_SRV/", {
	json : true,
	loadMetadataAsync : true
	});
	oModel.attachMetadataLoaded(function(e){
	var path = "/Help_ECUserSet('1')"
	oModel.read( path,
	{
	sPath : path,
	context : this,
	success : function(oData,response) {
								abc(oData);
	},
	error : function(oError) { 
	ZICERP_F4.js.publicFunction.onError(oError);
	},
	async : true
	}); 
},this);

Model的非同步請求互動之後有success和error兩個回撥,執行成功之後走success,失敗error。業內有句話:“程式設計師是上帝,給業務流程指定了人生軌跡”,個人覺得恰到好處!

由於Javascript執行是單執行緒的,那麼複雜的業務場景中就不無避免會遇到回撥。Promise就是適用於回撥的業務場景之中,雖然我們可以藉助非它進行回撥,弊端在於多層回撥的時候,程式碼會變得非常冗餘。

Promise的鏈式呼叫(函式的執行依賴於上一個函式執行結果)的方式來執行回撥函式給予了我們很大便利,上程式碼:

new Promise(function(resolve, reject) {//等待(pending)、已完成(fulfilled)、已拒絕(rejected)

                resolve(10);//new一個Promise物件

            })

            .then(function(num) { console.log('第一個:', num); return num * 2; })

            .then(function(num) { console.log('第二個:', num); return num * 2; })

            .then(function(num) { console.log('第三個: ',num);})
            .catch(function(){});
執行結果:

更多的應用場景是包在一個具體的執行函式中例項化一個Promise物件,針對函式執行結果進行規劃then函式走向:

function f1(){
                try{
                    var p=new Promise(function(resolve,reject){
                        var num = Math.round(Math.random()*10);//取0到10的隨機整數
                        if(num <= 5){
                            //指定resolve狀態
                            resolve(num);
                        }else{
                            //指定reject狀態
                            reject(num);
                        }
                    });
                    return p;
                }catch(err){
                  console.log(err.message);
                }
              }
              
              
              f1().then(function(data){
                //resolve
                console.log(data + ":為resolve")
              },function(res,data){
                //reject
                console.log(res + ": 數值大於5為reject")
              });

執行結果:

程式指定生成的隨機整數大於5的時候指定promise狀態為reject,小於5的時候為resolve狀態;當然多層次的回撥繼續在f1().then().then().then().............;


Promise的內容就這些嗎?當然不是啦,這麼牜的東西肯定還有很多內容的,race、finally、all、catch以及前端工程師都玩過的Jquery裡Promise等等,這些在實際專案中還未玩過,所以筆記後面繼續完善!不用不知道,一用就知道!水平有限,歡迎交流指正~~~~最後祝:工作順利微笑