摘要:周五就想寫這篇文章,但是無奈花花世界的誘惑太多就一直拖到了今天,自責遍進入正題對象用于表示一個異步操作的最終狀態完成或失敗,以及其返回的值。
周五就想寫這篇文章,但是無奈花花世界的誘惑太多……就一直拖到了今天,自責1e4遍;
進入正題Promise:
Promise 對象用于表示一個異步操作的最終狀態(完成或失?。?,以及其返回的值。
上為MDNPromise的定義;
ES6規定Promise是一個構造函數,用來生成Promise實例(就是跟new一個女朋友一樣);
Promise意為‘承諾’,承諾是發生在未來且必須達成的事,對應Promise對象是一個保存著未來才會結束的異步操作的“容器”;
Promise對象代表的異步操作有三個狀態:
pending (進行中)
fulfilled (已成功)
rejected (已失敗)
Promise對象有一下兩個特點:
上述的三個狀態一經改變則不會更改且任何時候都可以得到這個結果
只有異步操作的結果可以決定當前狀態的變化,其他任何操作都不改變Promise對象的狀態,即承諾這個詞的由來,也表現了程序猿的浪漫~~
先說說基本用法然后再來實操~const promise = new Promise(function(resolve, reject) { // ... some code 立即執行 if (/* 異步操作成功 */){ resolve(value);// 將狀態改為fulfilled 并將參數傳遞給then中的回調函數 } else { reject(error);// 將狀態改為rejected 并將參數傳遞給then/catch中的回調函數 } }); // then方法接受兩個參數分別對應兩個狀態的處理,其中對應rejected的參數可選,兩個參數都接受上面promise對象傳出的參數作為參數 promise.then(function(value) { // success 成功處理 }, function(error) { // failure 錯誤處理 });
了解了基本用法我們來了解一下Promise到底有啥用啊,我的理解就是以同步的方式(鏈式調用)去處理異步操作(回調),在這個Promise對象出現之前我們是怎么處理異步操作的呢?
舉個栗子~:
console.log("start"); setTimeout(function (name) { var fruitList = name + ","; setTimeout(function (name) { fruitList += name + ","; setTimeout(function (name) { fruitList += name + ","; setTimeout(function (name) { fruitList += name + ","; setTimeout(function (name) { fruitList += name; console.log(fruitList); }, 1, "西瓜"); }, 1, "香蕉"); }, 1, "橘子"); }, 1, "蘋果");}, 1, "葡萄"); console.log("上面是個異步過程,所以我先出來,后面才是水果");
我這里只是簡單的寫了幾層簡單的定時器而已,如果要很多很多層并且稍微復雜一點的回調函數就很難以維護了且代碼閱讀很難受。所以Promise的出現就是為了鏈式的調用來實現這種異步操作同樣以本例改為Promise的方式來一遍~:
console.log("start"); var promise1 = new Promise((resolve,reject)=>{ setTimeout(resolve("葡萄"),1); }); promise1.then(value=>new Promise((resolve,reject)=>setTimeout(resolve(value+",蘋果"),1))) .then(value=>new Promise((resolve,reject)=>setTimeout(resolve(value+",橘子"),1))) .then(value=>new Promise((resolve,reject)=>setTimeout(resolve(value+",香蕉"),1))) .then(value=>new Promise((resolve,reject)=>setTimeout(resolve(value+",西瓜"),1))) .then(value=>{console.log(value)}); console.log("上面是個異步過程,所以我先出來,后面才是水果");
其實本例中的reject參數可以省略,因為我默認他肯定會成功的了,額還有就是寫function比較麻煩這里直接用了箭頭函數~~恩……在科普一個小坑給你們,如果在vue中使用promise用箭頭函數要比寫function舒服很多,function中this指向的是window而不是vue實例~
再來看看下面這個拋出錯誤的相關栗子:
console.log("start"); new Promise((resolve, reject) => { var data = [1,2,3,4,5,6,7]; return resolve(data); }) .then((result) => { var newResult = result.slice(1); return newResult; }) .then((result)=>{ console.log(result); throw new Error("someting error"); }) .catch((value)=>{ console.log(value);// 拋出錯誤之后 執行catch操作 接受的參數是拋出的錯誤,其實.catch只是Promise.then(reject)的別名而已 }) .then((value) => { console.log(value);// undefined 拋出錯誤后沒有 return 所以這里是個undefined console.log("我任性,錯了之后仍要執行");// catch之后仍然可以繼續執行then操作 });
注釋上寫的很清楚咯~~
接下來在來個實際點的用法異步加載圖片(原諒我其實是從阮一峰老師那里偷來的栗子吃):
function loadImageAsync(url){ return new Promise((resolve,reject)=>{ var image = new Image(); image.onload = function(){ resolve(image); } image.onerror = function(){ reject(new Error("不能加載圖片,url是"+ url)); } image.src = url; }); } loadImageAsync("QQ圖片20171114220539.png").then(value =>{ console.log(value); document.body.append(value); });
由于最近確實是忙得頭昏腦脹,就先簡單的分享一波基礎用法,剩下的關于promise的兩種模式Promise.all()和Promise.race()等我改天再加或者另發一篇吧
同樣你也可以去這里學習了解一下:http://es6.ruanyifeng.com/#do...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93400.html
摘要:的翻譯文檔由的維護很多人說,阮老師已經有一本關于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:參數如前面所提到的,方法只是方法的一個語法糖,原因就在于方法的參數為實際上是兩個回調函數,分別用于處理調用它的對象的和狀態,而方法就等價于狀態處理函數。對象狀態傳遞和改變的方法利用回調的返回值,可以控制某個操作后方法返回的對象及其狀態。 注意,本文主要針對ES6標準實現的Promise語法進行闡述,實例代碼也都使用ES6語法,快速入門ES6請參見ECMAScript 6 掃盲。 一分鐘...
摘要:前端工程師學習資料,快速查找面試題,經典技術文章的總結,編程技巧,幫助學習者快速定位問題花點時間整理出一下前端工程師日常工作所需要的學習資料查找,幫助學習者快速掌握前端工程師開發的基本知識編程始于足下記住再牛逼的夢想也抵不住傻逼似的堅持蝴蝶 前端工程師學習資料,快速查找面試題,經典技術文章的總結,編程技巧,幫助學習者快速定位問題花點時間整理出一下web前端工程師日常工作所需要的學習資料...
閱讀 3572·2023-04-26 02:10
閱讀 1321·2021-11-22 15:25
閱讀 1675·2021-09-22 10:02
閱讀 913·2021-09-06 15:02
閱讀 3475·2019-08-30 15:55
閱讀 608·2019-08-30 13:58
閱讀 2782·2019-08-30 12:53
閱讀 3060·2019-08-29 12:38