關(guān)于ES6異步的處理Promise(超級萌新版)

其實(shí)關(guān)于異步的處理,我個(gè)人是大體已經(jīng)明白了其語法及實(shí)現(xiàn)方式了陪踩,但我就卡在了一個(gè)問題上,異步存在的意義是什么悉抵?關(guān)于這一點(diǎn)肩狂。。我想了大概兩天(屬于是豬腦過載了)姥饰,然后在晚上打游戲的時(shí)候傻谁,看著兵線過塔,突然明白了異步是干什么的列粪,于是果斷投降审磁,開始了這篇文章。

異步的意義

那么首先追問意義前岂座,先要知道異步是啥态蒂。我先寫一段同步代碼:

console.log(1);console.log(2);console.log(3);

那么在控制臺(tái)中,輸出的就是 1 2 3

接下來看下面這段異步代碼:

console.log(1);let time = setTimeout(() => {console.log(2)},0);console.log(3)

ok费什,那么這段代碼的輸出是什么呢钾恢?答案是 1? 3? 2

由此可以看出,所謂同步就是按照順序鸳址,從上而下瘩蚪,一種存在阻塞的編碼。而異步打破了這種規(guī)律稿黍,是一種非阻塞的編程疹瘦。

雖然我寫的這個(gè)代碼很簡單,但我覺得已經(jīng)充分說明了問題巡球。因?yàn)镴avaScript是一種自上而下編譯的代碼言沐,所以就有一個(gè)先來后到的規(guī)則邓嘹,就假如馬路上都是小轎車,這時(shí)候突然開進(jìn)來一臺(tái)重型卡車险胰,那么是不是會(huì)造成堵塞吴超?如果這輛卡車不開過去,那后面的小轎車是否就無法正常運(yùn)行鸯乃?這里的意義也是一樣鲸阻,在JavaScript中,也有函數(shù)會(huì)長期占用車道缨睡,比如延時(shí)器函數(shù)等鸟悴,那么這里就需要異步的存在,來將那些特殊的函數(shù)掛起奖年,在需要運(yùn)行或同步完成后再進(jìn)行细诸。

Promise對象

在上述代碼中,我使用了延時(shí)器函數(shù)來完成異步的操作陋守,但這是特例震贵,并不是說所有函數(shù)都能自主的完成異步操作。而在實(shí)際編程中水评,我們也并不總是要代碼自上而下執(zhí)行猩系,總有幾個(gè)特殊任務(wù)是需要掛起的,這時(shí)候中燥,就需要用的ES6提供的一個(gè)對象Promise對象寇甸。

promise是一個(gè)對象,同時(shí)也是一個(gè)構(gòu)造函數(shù)疗涉,通過promise可以new一個(gè)實(shí)例來幫助完成異步的處理拿霉,基本語法是:

let demo = new Promise((resolve,reject) => {})

這里不熟悉回調(diào)函數(shù)的可能會(huì)有點(diǎn)懵逼,如果懵逼的話我的建議是先不學(xué)習(xí)ES6咱扣。绽淘。因?yàn)檎娴臅?huì)暈掉的,看不懂又硬看闹伪,進(jìn)度真的很慢沪铭。

promise中以回調(diào)函數(shù)作為參數(shù),而回調(diào)函數(shù)中傳入兩個(gè)函數(shù)作為第二和第二參數(shù)祭往,這兩個(gè)中伦意,第一個(gè)參數(shù)resolve代表符合條件時(shí)觸發(fā)的邏輯火窒,reject作為不符合條件時(shí)觸發(fā)的參數(shù)硼补。那么下面我簡單的定義一個(gè)布爾值來補(bǔ)全這段代碼:

let isRun = true;

? ? ? ? let demo = new Promise((resolve,reject)=> {

? ? ? ? ? ? if (isRun) {

? ? ? ? ? ? ? ? resolve();

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? reject();

? ? ? ? ? ? }

? ? ? ? })

// 好了,到這里如果能看懂熏矿,那么可以繼續(xù)看已骇,看不懂的我就建議你反復(fù)閱讀上面內(nèi)容或者remake离钝。。

在上面代碼中褪储,我們就基本完整創(chuàng)建了一個(gè)異步實(shí)例卵渴,我們接下來就可以調(diào)用這個(gè)實(shí)例來處理我們需要異步的函數(shù)。

then()方法

該方法是由promise對象提供的方法鲤竹,我先抄一段大佬的解釋:then可以接收構(gòu)造函數(shù)中處理的狀態(tài)變化浪读,并分別對應(yīng)執(zhí)行。then方法有2個(gè)函數(shù)參數(shù)辛藻,第一個(gè)函數(shù)接收resolved(promise狀態(tài)為成功)的執(zhí)行碘橘,第二個(gè)函數(shù)接收reject(promise狀態(tài)為失敗)的執(zhí)行

這里對于基礎(chǔ)不太好的人吱肌,可能又要暈了痘拆,所以其實(shí)可以不用糾結(jié)這段話中的狀態(tài)什么的,我們只要明白氮墨,接下來我們必須使用then()才能完成異步的操作纺蛆。上代碼:

let isRun = true;

? ? ? ? let demo = new Promise((resolve,reject)=> {

? ? ? ? ? ? if (isRun) {

? ? ? ? ? ? ? ? resolve('成功!');

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? reject();

? ? ? ? ? ? }

? ? ? ? })

? ? ? ? demo.then(

? ? ? ? ? ? (res) => {

? ? ? ? ? ? ? ? console.log(res);

? ? ? ? ? ? },

? ? ? ? ? ? (err) => {

? ? ? ? ? ? ? ? console.log('失敗了');

? ? ? ? ? ? }

? ? ? ? )

這里應(yīng)該能看到then的使用過程了规揪,在then中應(yīng)用了兩個(gè)回調(diào)函數(shù)作為參數(shù)桥氏,其中第一個(gè)參數(shù)接收執(zhí)行成功后返回的resolve,其實(shí)也就是resolve猛铅。

這里有關(guān)于resolve的形參傳遞的一個(gè)問題识颊,我這里直接標(biāo)注出來便于理解:

應(yīng)該很清晰了,前面實(shí)例的resolve的參數(shù)傳入了then中奕坟。這里要明白我的res到底是哪里來的祥款。

catch()方法

catch()方法是用來捕捉promise狀態(tài)為失敗的函數(shù),該函數(shù)只有一個(gè)回調(diào)函數(shù)作為參數(shù)月杉,也就是返回錯(cuò)誤信息刃跛。該函數(shù)可寫可不寫,因?yàn)閠hen中的第二個(gè)函數(shù)也可以作為狀態(tài)失敗調(diào)用的函數(shù)苛萎。不過如果邏輯不是很清晰的話桨昙,可以讓then()專門返回成功狀態(tài),catch()專門返回失敗狀態(tài)腌歉。所以前面的代碼可以寫成:

let isRun = true;

? ? ? ? let demo = new Promise((resolve,reject)=> {

? ? ? ? ? ? if (isRun) {

? ? ? ? ? ? ? ? resolve('成功蛙酪!');

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? reject();

? ? ? ? ? ? }

? ? ? ? })

? ? ? ? demo.then(

? ? ? ? ? ? (res) => {

? ? ? ? ? ? ? ? console.log(res);

? ? ? ? ? ? }

? ? ? ? ).catch(

? ? ? ? ? ? (err) => {

? ? ? ? ? ? ? ? console.log('失敗了');

? ? ? ? ? ? }

? ? ? ? )

這里是用鏈?zhǔn)浇Y(jié)構(gòu)寫的,不會(huì)的可以查一下什么是鏈?zhǔn)浇Y(jié)構(gòu)翘盖,或者直接分開寫桂塞。

p.s.這里說一下還有個(gè)finally函數(shù),就是在promise執(zhí)行完畢(無論成功與否)后調(diào)用的函數(shù)馍驯,但我查了一下阁危,該函數(shù)并被標(biāo)準(zhǔn)函數(shù)玛痊,我也不知道是否支持,所以就不寫了狂打,感興趣的可以查一下擂煞。

封裝Promise

let getPromise = (demo) => {

? ? ? ? ? ? return new Promise((resolve,reject) => {

? ? ? ? ? ? ? ? if (demo) {

? ? ? ? ? ? ? ? ? ? resolve('成功');

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? reject('失敗')

? ? ? ? ? ? ? ? }

? ? ? ? ? ? })

? ? ? ? }

let demo = getPromise(true)

? ? ? ? demo.then(

? ? ? ? ? ? (res) => {

? ? ? ? ? ? ? ? console.log(res);

? ? ? ? ? ? }

? ? ? ? )

這里就是普遍的寫法,看到這里給我說看不懂的建議死刑


ok趴乡,到這里應(yīng)該就差不多对省,基本的寫法是已經(jīng)有了,如果是小白只想理解promise是啥的晾捏,看到這里就行了官辽,如果是正兒八經(jīng)學(xué)習(xí)的,那可以繼續(xù)看一下粟瞬。

async[?'z??k]和await(暫時(shí)簡寫)

async/await是什么

async/await 是ES7提出的基于Promise的解決異步的最終方案同仆。

async

async是一個(gè)加在函數(shù)前的修飾符,被async定義的函數(shù)會(huì)默認(rèn)返回一個(gè)Promise對象resolve的值裙品。因此對async函數(shù)可以直接then俗批,返回值就是then方法傳入的函數(shù)。

await

await 也是一個(gè)修飾符市怎,只能放在async定義的函數(shù)內(nèi)岁忘。可以理解為等待区匠。

await 修飾的如果是Promise對象:可以獲取Promise中返回的內(nèi)容(resolve或reject的參數(shù))干像,且取到值后語句才會(huì)往下執(zhí)行;

如果不是Promise對象:把這個(gè)非promise的東西當(dāng)做await表達(dá)式的結(jié)果驰弄。

async/await 的正確用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末麻汰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子戚篙,更是在濱河造成了極大的恐慌五鲫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岔擂,死亡現(xiàn)場離奇詭異位喂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)乱灵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門塑崖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痛倚,你說我怎么就攤上這事规婆。” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵聋呢,是天一觀的道長苗踪。 經(jīng)常有香客問我颠区,道長削锰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任毕莱,我火速辦了婚禮器贩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朋截。我一直安慰自己蛹稍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布部服。 她就那樣靜靜地躺著唆姐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廓八。 梳的紋絲不亂的頭發(fā)上奉芦,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音剧蹂,去河邊找鬼声功。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宠叼,可吹牛的內(nèi)容都是我干的先巴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冒冬,長吁一口氣:“原來是場噩夢啊……” “哼伸蚯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起简烤,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朝卒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乐埠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抗斤,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年丈咐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瑞眼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棵逊,死狀恐怖伤疙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤徒像,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布黍特,位于F島的核電站,受9級特大地震影響锯蛀,放射性物質(zhì)發(fā)生泄漏灭衷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一旁涤、第九天 我趴在偏房一處隱蔽的房頂上張望翔曲。 院中可真熱鬧,春花似錦劈愚、人聲如沸瞳遍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掠械。三九已至,卻和暖如春注祖,著一層夾襖步出監(jiān)牢的瞬間猾蒂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工氓轰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婚夫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓署鸡,卻偏偏與公主長得像案糙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子靴庆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 字符串 1.什么是字符串 使用單引號或者雙引號括起來的字符集就是字符串时捌。 引號中單獨(dú)的符號、數(shù)字炉抒、字母等叫字符奢讨。 ...
    mango_2e17閱讀 7,510評論 1 7
  • 《閉上眼睛才能看清楚自己》這本書是香海禪寺主持賢宗法師的人生體悟,修行心得及講學(xué)錄焰薄,此書從六個(gè)章節(jié)講述了禪修是什么...
    宜均閱讀 10,024評論 1 25
  • 前言 Google Play應(yīng)用市場對于應(yīng)用的targetSdkVersion有了更為嚴(yán)格的要求拿诸。從 2018 年...
    申國駿閱讀 64,224評論 14 98
  • 第七章:理性的投資觀 字?jǐn)?shù): 1.投資要圍繞目的進(jìn)行 投資的目的是為了掙錢。投資的除了金錢還有時(shí)間和精力也是一種投...
    幸福萍寶閱讀 3,326評論 1 2
  • 本文轉(zhuǎn)載自微信公眾號“電子搬磚師”塞茅,原文鏈接 這篇文章會(huì)以特別形象通俗的方式講講什么是PID亩码。 很多人看到網(wǎng)上寫的...
    這個(gè)飛宏不太冷閱讀 6,844評論 2 15