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等等,這些在實際專案中還未玩過,所以筆記後面繼續完善!不用不知道,一用就知道!水平有限,歡迎交流指正~~~~最後祝:工作順利