摘要:周五就想寫這篇文章,但是無(wú)奈花花世界的誘惑太多就一直拖到了今天,自責(zé)遍進(jìn)入正題對(duì)象用于表示一個(gè)異步操作的最終狀態(tài)完成或失敗,以及其返回的值。
周五就想寫這篇文章,但是無(wú)奈花花世界的誘惑太多……就一直拖到了今天,自責(zé)1e4遍;
進(jìn)入正題Promise:
Promise 對(duì)象用于表示一個(gè)異步操作的最終狀態(tài)(完成或失?。?,以及其返回的值。
上為MDNPromise的定義;
ES6規(guī)定Promise是一個(gè)構(gòu)造函數(shù),用來(lái)生成Promise實(shí)例(就是跟new一個(gè)女朋友一樣);
Promise意為‘承諾’,承諾是發(fā)生在未來(lái)且必須達(dá)成的事,對(duì)應(yīng)Promise對(duì)象是一個(gè)保存著未來(lái)才會(huì)結(jié)束的異步操作的“容器”;
Promise對(duì)象代表的異步操作有三個(gè)狀態(tài):
pending (進(jìn)行中)
fulfilled (已成功)
rejected (已失敗)
Promise對(duì)象有一下兩個(gè)特點(diǎn):
上述的三個(gè)狀態(tài)一經(jīng)改變則不會(huì)更改且任何時(shí)候都可以得到這個(gè)結(jié)果
只有異步操作的結(jié)果可以決定當(dāng)前狀態(tài)的變化,其他任何操作都不改變Promise對(duì)象的狀態(tài),即承諾這個(gè)詞的由來(lái),也表現(xiàn)了程序猿的浪漫~~
先說(shuō)說(shuō)基本用法然后再來(lái)實(shí)操~const promise = new Promise(function(resolve, reject) { // ... some code 立即執(zhí)行 if (/* 異步操作成功 */){ resolve(value);// 將狀態(tài)改為fulfilled 并將參數(shù)傳遞給then中的回調(diào)函數(shù) } else { reject(error);// 將狀態(tài)改為rejected 并將參數(shù)傳遞給then/catch中的回調(diào)函數(shù) } }); // then方法接受兩個(gè)參數(shù)分別對(duì)應(yīng)兩個(gè)狀態(tài)的處理,其中對(duì)應(yīng)rejected的參數(shù)可選,兩個(gè)參數(shù)都接受上面promise對(duì)象傳出的參數(shù)作為參數(shù) promise.then(function(value) { // success 成功處理 }, function(error) { // failure 錯(cuò)誤處理 });
了解了基本用法我們來(lái)了解一下Promise到底有啥用啊,我的理解就是以同步的方式(鏈?zhǔn)秸{(diào)用)去處理異步操作(回調(diào)),在這個(gè)Promise對(duì)象出現(xiàn)之前我們是怎么處理異步操作的呢?
舉個(gè)栗子~:
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("上面是個(gè)異步過(guò)程,所以我先出來(lái),后面才是水果");
我這里只是簡(jiǎn)單的寫了幾層簡(jiǎn)單的定時(shí)器而已,如果要很多很多層并且稍微復(fù)雜一點(diǎn)的回調(diào)函數(shù)就很難以維護(hù)了且代碼閱讀很難受。所以Promise的出現(xiàn)就是為了鏈?zhǔn)降恼{(diào)用來(lái)實(shí)現(xiàn)這種異步操作同樣以本例改為Promise的方式來(lái)一遍~:
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("上面是個(gè)異步過(guò)程,所以我先出來(lái),后面才是水果");
其實(shí)本例中的reject參數(shù)可以省略,因?yàn)槲夷J(rèn)他肯定會(huì)成功的了,額還有就是寫function比較麻煩這里直接用了箭頭函數(shù)~~恩……在科普一個(gè)小坑給你們,如果在vue中使用promise用箭頭函數(shù)要比寫function舒服很多,function中this指向的是window而不是vue實(shí)例~
再來(lái)看看下面這個(gè)拋出錯(cuò)誤的相關(guān)栗子:
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);// 拋出錯(cuò)誤之后 執(zhí)行catch操作 接受的參數(shù)是拋出的錯(cuò)誤,其實(shí).catch只是Promise.then(reject)的別名而已 }) .then((value) => { console.log(value);// undefined 拋出錯(cuò)誤后沒(méi)有 return 所以這里是個(gè)undefined console.log("我任性,錯(cuò)了之后仍要執(zhí)行");// catch之后仍然可以繼續(xù)執(zhí)行then操作 });
注釋上寫的很清楚咯~~
接下來(lái)在來(lái)個(gè)實(shí)際點(diǎn)的用法異步加載圖片(原諒我其實(shí)是從阮一峰老師那里偷來(lái)的栗子吃):
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); });
由于最近確實(shí)是忙得頭昏腦脹,就先簡(jiǎn)單的分享一波基礎(chǔ)用法,剩下的關(guān)于promise的兩種模式Promise.all()和Promise.race()等我改天再加或者另發(fā)一篇吧
同樣你也可以去這里學(xué)習(xí)了解一下:http://es6.ruanyifeng.com/#do...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93400.html
摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺(jué)得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:參數(shù)如前面所提到的,方法只是方法的一個(gè)語(yǔ)法糖,原因就在于方法的參數(shù)為實(shí)際上是兩個(gè)回調(diào)函數(shù),分別用于處理調(diào)用它的對(duì)象的和狀態(tài),而方法就等價(jià)于狀態(tài)處理函數(shù)。對(duì)象狀態(tài)傳遞和改變的方法利用回調(diào)的返回值,可以控制某個(gè)操作后方法返回的對(duì)象及其狀態(tài)。 注意,本文主要針對(duì)ES6標(biāo)準(zhǔn)實(shí)現(xiàn)的Promise語(yǔ)法進(jìn)行闡述,實(shí)例代碼也都使用ES6語(yǔ)法,快速入門ES6請(qǐng)參見ECMAScript 6 掃盲。 一分鐘...
摘要:首先,作為入門的話,的用戶手冊(cè)是個(gè)很不錯(cuò)的選擇,里面基本覆蓋了使用的各方面。所以下面主要是我學(xué)習(xí)的一些筆記,姑且當(dāng)作是一篇入門吧。下面我們正式進(jìn)入正題。這也是最常用的一個(gè)用法之一。有兩個(gè)方式進(jìn)行配置。 首先,作為入門的話,Babel的用戶手冊(cè)是個(gè)很不錯(cuò)的選擇,里面基本覆蓋了Babel使用的各方面。所以下面主要是我學(xué)習(xí)Babel的一些筆記,姑且當(dāng)作是一篇入門吧。 Babel是什么 按照B...
摘要:前端工程師學(xué)習(xí)資料,快速查找面試題,經(jīng)典技術(shù)文章的總結(jié),編程技巧,幫助學(xué)習(xí)者快速定位問(wèn)題花點(diǎn)時(shí)間整理出一下前端工程師日常工作所需要的學(xué)習(xí)資料查找,幫助學(xué)習(xí)者快速掌握前端工程師開發(fā)的基本知識(shí)編程始于足下記住再牛逼的夢(mèng)想也抵不住傻逼似的堅(jiān)持蝴蝶 前端工程師學(xué)習(xí)資料,快速查找面試題,經(jīng)典技術(shù)文章的總結(jié),編程技巧,幫助學(xué)習(xí)者快速定位問(wèn)題花點(diǎn)時(shí)間整理出一下web前端工程師日常工作所需要的學(xué)習(xí)資料...
閱讀 3611·2023-04-26 02:10
閱讀 1397·2021-11-22 15:25
閱讀 1702·2021-09-22 10:02
閱讀 945·2021-09-06 15:02
閱讀 3505·2019-08-30 15:55
閱讀 635·2019-08-30 13:58
閱讀 2807·2019-08-30 12:53
閱讀 3092·2019-08-29 12:38