Promise的基本使用

利用Promise是解決JS異步執行時候回調函數嵌套回調函數的問題, 更簡潔地控制函數執行流程;

  通過new實例化Promise, ?構造函數需要兩個參數, 第一個參數為函數執行成功以后執行的函數resolve, 第二個函數為函數執行失敗以后執行的函數reject:

new Promise(function(resolve , reject) {
});

  通過Promise,我們把回調函數用線性的方式寫出來,而不是一層套一層, 這個函數有四層回調;

fn("args", function(a) {fn1("foo", function(b) {fn2("bar", function(c) {fn3("baz", function(d) {alert("回調成功,獲知的內容為:"+a+b+c+d)})})})
})

  以上的Demo只有包含成功的回調, 如果失敗的回調也算的話, 也就更麻煩了;

  

  如果使用Promise的方式,我們可以改裝成線性的代碼, 更加符合閱讀習慣,只要在then函數下寫邏輯即可;

new Promise(function(resolve , reject) {resolve(1);
}).then(function(val) {console.log(val);return new Promise(function(resolve , reject) {resolve(2);});
}).then(function(val) {console.log(val);return new Promise(function(resolve , reject) {resolve(3);});
}).then(function(val) {console.log(val);return new Promise(function(resolve , reject) {resolve(4);});
}).then(function(val) {console.log(val);
});

Promise實例的三種狀態:

  每一個實例化的Promise都有三個狀態;pending(等待) ?rejected(拒絕) ?resolved(解決) ,默認的狀態為pending,如果執行了resolve(), 那么這個promise的狀態會變為resolve,如果執行了reject(), 那么這個promise的狀態就會變成rejected, 而且這些狀態是不可撤銷的,一經更改,不會再變了;

  then方法:

  promise有一個then方法,then方法接收兩個參數, 第一個為函數的成功回調, 第二個為函數的失敗回調:

var promise = new Promise(function(resolve , reject) {resolve(); //執行成功回調;
});
console.log(0);
promise.then(function(val) {console.log(1); 
}, function() {console.log("失敗");
});
console.log("2");
var promise = new Promise(function(resolve , reject) {reject();
});
console.log(0);
promise.then(function(val) {console.log(1);
}, function() {console.log("失敗");
});
console.log("2");

  then方法每一次都是返回不同的Promise實例,then的第一個參數是成功回調, 這個成功回調的參數為: 上一個Promise實例執行resolve方法的參數;

  一般來說, then方法會返回當前的promise, 如果在then方法里面return 一個新的Promise實例,那么此時的then返回的就是新的Promise實例, 利用這個特性,就可以實現多層回調

new Promise(function(resolve , reject) {resolve(1);
}).then(function(val) {console.log(val);return new Promise(function(resolve , reject) {resolve(2);});
}).then(function(val) {console.log(val);return new Promise(function(resolve , reject) {resolve(3);});
}).then(function(val) {console.log(val);return new Promise(function(resolve , reject) {resolve(4);});
}).then(function(val) {console.log(val);
});

  不管代碼是異步還是同步的, 都可以用Promise的then方法, 同步的代碼直接寫在then方法第一個參數, 把需要參數通過resolve傳給下一個then方法,

  如果是異步的代碼, 就直接return一個Promise實例:

new Promise(function(resolve , reject) {resolve(1);
}).then(function(val) {console.log(val);return 2;
}).then(function(val) {console.log(val);return 3;
}).then(function(val) {console.log(val);return new Promise(function(resolve,reject) {//異步操作些這里resolve(4);});
}).then(function(val) {console.log(val);return 5;
}).then(function(val) {console.log(val);
});

以上只是Promise的一些基礎知識, 還有一些其他的知識點, 因為能力有限不一一介紹了(Promise.resolve的不同參數, 與Generator一起使用, Promise的附加方法, 等等等等);

轉載于:https://www.cnblogs.com/xunf/p/8588156.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250777.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟工作業PSP與單元測試訓練

一、實現模塊判斷傳入的身份證號碼的正確性; 二、針對所實現的模塊編寫對應的單元測試代碼; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.u…

koa --- nunjucks

安裝: npm install koa-nunjucks-2 --save目錄結構 |--- controller/ | |--- home.js |--- service/ | |--- home.js |--- views/ |--- app.js |--- router.jsapp.js // (部分) const nunjucks require(koa-nunjucks-2); app.use(nunjucks({ext: html,path: path.joi…

DNN模型訓練詞向量原理

轉自:https://blog.csdn.net/fendouaini/article/details/79821852 1 詞向量 在NLP里,最細的粒度是詞語,由詞語再組成句子,段落,文章。所以處理NLP問題時,怎么合理的表示詞語就成了NLP領域中最先需要解決的…

天平稱重【遞歸解法】

用天平稱重時,我們希望用盡可能少的砝碼組合稱出盡可能多的重量。如果只有5個砝碼,重量分別是1,3,9,27,81則它們可以組合稱出1到121之間任意整數重量(砝碼允許放在左右兩個盤中)。 本…

算法 --- reduce的使用.

描述: 難點: 將[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]輸出為[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 關鍵代碼描述: 1.假設我們已經根據輸入的數字得到了 rawArr [[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]] 2. 下一步將rawArr[0…

SpringBoot、mysql配置PageHelper插件

一:https://blog.csdn.net/h985161183/article/details/79800737 主要異常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration: pageHelper.…

字符串的拆分以及分隔符所在不同位置的刪除

try { //根據imComuserGroupMng獲取這個數據庫的所有ImComuserGroup數據 List<ImComuserGroup> list imComuserGroupMng.findAllComuserGroup(); //便利實體數據list為數據的集合 …

算法 --- 遞歸生成括號

問題描述 思路: 1.首先生成n個括號 2.左括號數量(記為l)不超過n 3.右括號數量(記為r)不超過n,且優先生成左括號(即 l < r) 4.需要設計一個遞歸式h(str,l,r) // 一開始,str , l 0, r 0 // 第一步進去,添加左括號, str(, l 1, r 0 // 然后因為 l < n . r < l 所以…

使用 TypeScript 改造構建工具及測試用例

最近的一段時間一直在搞TypeScript&#xff0c;一個巨硬出品、賦予JavaScript語言靜態類型和編譯的語言。 第一個完全使用TypeScript重構的純Node.js項目已經上線并穩定運行了。 第二個前后端的項目目前也在重構中&#xff0c;關于前端基于webpack的TypeScript套路之前也有提到…

JavaScript 驗證表單不為空和獲取select下拉列表的值和文本

1.驗證表單不為空 var hasform { "Name": "名字", "Id_card": "身份證", "PaySalary": "月工資", "CardCode": "賬號", "Fk_Subjectf_Code": &quo…

javascript --- 變量污染全局作用域問題解決方案

日常寫法 // 假設你寫了幾個關于某個某塊的函數 function foo1 () {...} function foo2 () {...} function foo3 () {...}出現問題:假設你的團隊中也有一個人定義了foo1函數,那么你寫的將會覆蓋以前的函數,或者會被覆蓋掉.若前面使用let聲明了foo1變量.將會報錯. 解決污染 你…

solr7.4 安裝與使用

1.solr7環境要求 solr7需要java8環境&#xff0c;且需要在環境變量中添加 JAVA_HOME變量。 2.solr 安裝 下載地址 https://lucene.apache.org/solr/mirrors-solr-latest-redir.html 我下載為7.4版本 在solr5以前solr的啟動都有tomcat作為容器&#xff0c;但是從solr5以后solr內…

初入HTML5

在最開始接觸HTML5的時候&#xff0c;你會遇到的大多是一些常見常用的屬性以及屬性值。它們分類廣、品種雜且使用率高。到css各種樣式的時候&#xff0c;你會接觸到更多的東西&#xff0c;各種屬性、選擇器、盒子模型都是重點。那么&#xff0c;現在我們就看一下它們到底是什么…

javascript --- 讓函數的實例可以鏈式調用

關鍵: 在每個函數的末尾加上 return thisthis:在javascript中表示當前的對象 栗如: 有以下函數 var fooObj {foo1: function() {console.log(1);},foo2: function() {console.log(2);},foo3: function() {console.log(3);} }// 你想通過 fooObj.foo1().foo2().foo3() // …

ReactiveCocoa基礎

本文轉載自最快讓你上手ReactiveCocoa之基礎篇&#xff0c;在此基礎上稍作修改&#xff0c;歡迎交流。 有關對 ReactiveCocoa 的看法可以看一下唐巧的這篇ReactiveCocoa 討論會 ReactiveCocoa思維導圖ReactiveCocoa簡介 ReactiveCocoa&#xff08;簡稱為RAC&#xff09;,是由Gi…

javascript --- 創建一個二維數組

想創建一個 n*n 的矩陣,并全部賦予初始值false 你可能會想到下面 let arr []; for(let i 0 ;i< n;i) {arr[i] [];for( let j 0; j< n; j){arr[i][j] false;} }稍微封裝一下: function Cmatrix(n, c) {let arr [];for (let i 0; i < n; i) {arr[i] [];for (le…

配置OpenCV產生flann\logger.h(66): error C4996: ‘fopen': This function or variable may be unsafe問題

轉載自&#xff1a;http://guoming.me/%E9%85%8D%E7%BD%AEopencv%E4%BA%A7%E7%94%9Fflannlogger-h66-error-c4996-fopen-this-function-or-variable-may-be-unsafe%E9%97%AE%E9%A2%98 今天使用vs2012配置OpenCV編譯出現問題: 1>—— 已啟動生成: 項目: Win32ForOpenCV245, 配…

android listview和simpleadapter 給itme 中的控件添加事件

simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() { Override public boolean setViewValue(View view, Object data, String textRepresentation) {   Log.d("進入setview","進入setview");if(view instanceof Button &&am…

0 uC/OS 系統精講索引

uC/OS-II與uC/OS-III放在一起講&#xff0c;每個例程同時提供兩個版本的源代碼。 本系列教程主要涉及如下內容&#xff1a; 【原理部分】 1-操作系統簡介&#xff1a;基本概念 2-目錄結構與測試環境搭建&#xff1a;uC/OS-III emWin VS2015 2.1 官方文件目錄結構 【*】uC/Lib …

OPENCV-1 學習筆記

灰度圖&#xff1a;2維矩陣 彩色圖&#xff1a;3維矩陣 ps&#xff1a;目前大部分設備都是用無符號 8 位整數&#xff08;類型為 CV_8U&#xff09;表示像素亮度 Mat類定義&#xff1a; class CV_EXPORTS Mat { public://一系列函數.../* flag 參數中包含許多關于矩陣的信息…