久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

一文帶你輕松掌握Promise

一文帶你輕松掌握Promise

前端js學(xué)習(xí)中,讓大家最難受的就是異步的問(wèn)題,解決異步、回調(diào)地獄等問(wèn)題時(shí)你必須得學(xué)會(huì)promise,對(duì)于多數(shù)前端程序員來(lái)說(shuō)promise簡(jiǎn)直就是噩夢(mèng),本篇文章就是從通俗易懂的角度做為切入點(diǎn),幫助大家輕松掌握promise

異步編程


想要學(xué)習(xí)promise,你必須要懂得什么是異步編程!眾所周知,js語(yǔ)言是單線程機(jī)制。所謂單線程就是按次序執(zhí)行,執(zhí)行完一個(gè)任務(wù)再執(zhí)行下一個(gè)。但是不影響存在同步異步的兩種操作,這兩種操作做事情其實(shí)都是在一條流水線上(單線程),只是這兩種操作在單線程上的執(zhí)行順序不一樣罷了!當(dāng)js觸發(fā)到異步任務(wù)時(shí),會(huì)將異步任務(wù)交給瀏覽器處理,當(dāng)執(zhí)行有結(jié)果時(shí),會(huì)把異步任務(wù)的回調(diào)函數(shù)插入待處理隊(duì)列的隊(duì)尾!

我們通俗的去解釋一下我們的異步:異步就是從主線程發(fā)射一個(gè)子線程來(lái)完成任務(wù),每一個(gè)任務(wù)有一個(gè)或多個(gè)回調(diào)函數(shù)(callback),前一個(gè)任務(wù)結(jié)束后,不是執(zhí)行后一個(gè)任務(wù),而是執(zhí)行回調(diào)函數(shù)后一個(gè)任務(wù)則是不等前一個(gè)任務(wù)結(jié)束就執(zhí)行,所以程序的執(zhí)行順序與任務(wù)的排列順序是不一致的、異步的.

一文帶你輕松掌握Promise

該圖摘自于菜鳥(niǎo)教程中的異步編程小節(jié),幫助大家更好的理解什么是異步!

回調(diào)函數(shù)


回調(diào)函數(shù)的定義非常簡(jiǎn)單:一個(gè)函數(shù)被當(dāng)做一個(gè)實(shí)參傳入到另一個(gè)函數(shù)(外部函數(shù)),并且這個(gè)函數(shù)在外部函數(shù)內(nèi)被調(diào)用,用來(lái)完成某些任務(wù)的函數(shù)。就稱為回調(diào)函數(shù)

回調(diào)函數(shù)的兩種寫(xiě)法(實(shí)現(xiàn)效果相同):

const text = () => { 	   document.write('hello james') } setTimeout(text,1000)
登錄后復(fù)制

setTimeout(()=>{ 	   document.write("hello james") },1000)
登錄后復(fù)制

這段代碼中的 setTimeout 就是一個(gè)消耗時(shí)間較長(zhǎng)的過(guò)程,它的第一個(gè)參數(shù)是個(gè)回調(diào)函數(shù),第二個(gè)參數(shù)是毫秒數(shù),這個(gè)函數(shù)執(zhí)行之后會(huì)產(chǎn)生一個(gè)子線程,子線程會(huì)等待 1 秒,然后執(zhí)行回調(diào)函數(shù) "text",在文本中輸出hello james

setTimeout會(huì)在子線程中等待1秒,但是主線程的運(yùn)行不會(huì)受到影響!例如以下代碼:

setTimeout(()=>{     document.write("hello davis") },1000) console.log('123456');
登錄后復(fù)制

在這里會(huì)先打印出來(lái)123456(主線程),然后一秒后在文本中輸出hello davis(子線程)

回調(diào)地獄


回調(diào)地獄這個(gè)詞聽(tīng)起來(lái)就非常的高大上,想要接觸Promise之前,必須要懂得什么是回調(diào)地獄,以及為什么會(huì)產(chǎn)生回調(diào)地獄?
先來(lái)看看概念:當(dāng)一個(gè)回調(diào)函數(shù)嵌套一個(gè)回調(diào)函數(shù)的時(shí)候就會(huì)出現(xiàn)一個(gè)嵌套結(jié)構(gòu)當(dāng)嵌套的多了就會(huì)出現(xiàn)回調(diào)地獄的情況
舉個(gè)例子
比如我們發(fā)送三個(gè) ajax 請(qǐng)求:

  • 第一個(gè)正常發(fā)送
  • 第二個(gè)請(qǐng)求需要第一個(gè)請(qǐng)求的結(jié)果中的某一個(gè)值作為參數(shù)
  • 第三個(gè)請(qǐng)求需要第二個(gè)請(qǐng)求的結(jié)果中的某一個(gè)值作為參數(shù)

你會(huì)看到以下代碼

$.ajax({   url: '我是第一個(gè)請(qǐng)求',   type: 'get',   success (res) {     // 現(xiàn)在發(fā)送第二個(gè)請(qǐng)求     $.ajax({       url: '我是第二個(gè)請(qǐng)求',       type:'post',       data: { a: res.a, b: res.b },       success (res1) {         // 進(jìn)行第三個(gè)請(qǐng)求         $.ajax({           url: '我是第三個(gè)請(qǐng)求',           type:'post',           data: { a: res1.a, b: res1.b },                   success (res2) {              console.log(res2)            }         })       }     })   } })
登錄后復(fù)制

這種代碼看起來(lái)屬實(shí)是折磨人啊!當(dāng)我們把代碼寫(xiě)成這樣的時(shí)候,就陷入了可維護(hù)性差的狀態(tài)了,代碼體驗(yàn)非常的不良好,看一會(huì)就給看懵了,為了解決這個(gè)問(wèn)題,于是,就引入了我們的Promise,用Promise去解決回調(diào)地獄問(wèn)題!

Promise


Promise異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大,它是一個(gè) ECMAScript 6 提供的類,目的是更加優(yōu)雅地書(shū)寫(xiě)復(fù)雜的異步任務(wù)

Promise對(duì)象有以下兩個(gè)特點(diǎn):

  • 對(duì)象的狀態(tài)不受外界影響。Promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài)。這也是Promise這個(gè)名字的由來(lái),它的英語(yǔ)意思就是“承諾”,表示其他手段無(wú)法改變。

  • 一旦狀態(tài)改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果。Promise對(duì)象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果,這時(shí)就稱為 resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對(duì)Promise對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過(guò)了它,再去監(jiān)聽(tīng),是得不到結(jié)果的。

兩個(gè)特點(diǎn)摘自于??阮一峰ES6文章

Promise語(yǔ)法格式

new Promise(function (resolve, reject) {   // resolve 表示成功的回調(diào)   // reject 表示失敗的回調(diào) }).then(function (res) {   // 成功的函數(shù) }).catch(function (err) {   // 失敗的函數(shù) })
登錄后復(fù)制

出現(xiàn)了new關(guān)鍵字,就明白了Promise對(duì)象其實(shí)就是一個(gè)構(gòu)造函數(shù),是用來(lái)生成Promise實(shí)例的。能看出來(lái)構(gòu)造函數(shù)接收了一個(gè)函數(shù)作為參數(shù),該函數(shù)就是Promise構(gòu)造函數(shù)的回調(diào)函數(shù),該函數(shù)中有兩個(gè)參數(shù)resolvereject,這兩個(gè)參數(shù)也分別是兩個(gè)函數(shù)!

簡(jiǎn)單的去理解的話resolve函數(shù)的目的是將Promise對(duì)象狀態(tài)變成成功狀態(tài),在異步操作成功時(shí)調(diào)用,將異步操作的結(jié)果,作為參數(shù)傳遞出去。reject函數(shù)的目的是將Promise對(duì)象的狀態(tài)變成失敗狀態(tài),在異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤,作為參數(shù)傳遞出去。

Promise實(shí)例生成以后,可以用then方法分別指定resolved狀態(tài)rejected狀態(tài)的回調(diào)函數(shù)。

代碼示例:

        const promise = new Promise((resolve,reject)=>{             //異步代碼             setTimeout(()=>{                 // resolve(['111','222','333'])                 reject('error')             },2000)         })         promise.then((res)=>{             //兌現(xiàn)承諾,這個(gè)函數(shù)被執(zhí)行             console.log('success',res);         }).catch((err)=>{             //拒絕承諾,這個(gè)函數(shù)就會(huì)被執(zhí)行             console.log('fail',err);         })
登錄后復(fù)制

代碼分析:

上邊說(shuō)到Promise是一個(gè)構(gòu)造函數(shù),new之后等于說(shuō)調(diào)用了構(gòu)造函數(shù),構(gòu)造函數(shù)中傳的參數(shù)是一個(gè)函數(shù),這個(gè)函數(shù)內(nèi)的兩個(gè)參數(shù)分別又是兩個(gè)函數(shù)(reslovereject),雖然感覺(jué)很繞,但是理清思路會(huì)很清晰的!


我們得到對(duì)象promise,promise對(duì)象中自帶有兩個(gè)方法thencatch,這兩個(gè)方法中會(huì)分別再傳入一個(gè)回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)的目的在于返回你所需要成功或失敗的信息!那么怎么去調(diào)用這兩個(gè)回調(diào)函數(shù)呢?
看下方圖可以快速理解:

一文帶你輕松掌握Promise
這兩個(gè)函數(shù)分別做為參數(shù)(reslovereject)傳到上方的函數(shù)中去了.隨后在構(gòu)造函數(shù)的回調(diào)函數(shù)中寫(xiě)入異步代碼(例如:ajax定時(shí)器),這里使用了定時(shí)器作為例子,如果你想表達(dá)的是成功回調(diào),你可以在內(nèi)部調(diào)用函數(shù)reslove('一般情況下是后端返回的成功數(shù)據(jù))。如果你想表達(dá)的是失敗回調(diào),你可以調(diào)用reject('一般情況下是后端返回的失敗信息').

這些就是Promise執(zhí)行的過(guò)程!雖然理解著很繞,但是多讀幾遍絕對(duì)有不一樣的收獲!

Promise鏈?zhǔn)?/span>

then方法返回的是一個(gè)新的Promise實(shí)例注意:不是原來(lái)那個(gè)Promise實(shí)例)。因此可以采用鏈?zhǔn)綄?xiě)法,即then方法后面再調(diào)用另一個(gè)then方法

實(shí)際案例:
我想要實(shí)現(xiàn)在一個(gè)數(shù)組中查看一個(gè)帖子,但是我最終的目的是得到這個(gè)帖子下面的所有評(píng)論,這該怎么實(shí)現(xiàn)呢?

實(shí)現(xiàn)思路
先從一個(gè)接口中獲取這個(gè)帖子的信息,然后通過(guò)該帖子的帖子id從而獲取到該帖子下的所有評(píng)論

代碼如下:

pajax({     url:"http://localhost:3000/news",     data : {         author : "james"     } }).then(res=>{     return pajax({         url : "http://localhost:3000/comments",         data : {             newsId : res[0].id         }     }) }).then(res=>{     console.log(res); }).catch(err=>{     console.log(err); })
登錄后復(fù)制

代碼分析:

這里使用了一個(gè)Promise已經(jīng)封裝過(guò)的ajax,我們從第一個(gè)接口中得到了帖子id,然后在then中的函數(shù)發(fā)送第二個(gè)請(qǐng)求(攜帶了第一個(gè)請(qǐng)求返回過(guò)來(lái)的參數(shù)),我們最后想要拿到第二個(gè)接口的結(jié)果,于是又有了一個(gè)then方法,但是在第一個(gè)then方法中要把一個(gè)新的Promise實(shí)例return出去,這樣的話,第二個(gè)then才起作用!(這是因?yàn)?code>then方法是Promise 實(shí)例所具有的方法,也就是說(shuō),then方法是定義在原型對(duì)象Promise.prototype上的)====>我們可以打印一下:console.log(Promise.prototype)

一文帶你輕松掌握Promise
可以看的出來(lái)原型對(duì)象Promise.prototype中是有then方法的!

Promise.all()

Promise.all()方法用于將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例

語(yǔ)法格式:

const p = Promise.all([p1, p2, p3]);
登錄后復(fù)制

Promise.all()方法接受一個(gè)數(shù)組作為參數(shù),p1、p2、p3都是 Promise 實(shí)例,如果不是,就會(huì)調(diào)用Promise.reslove() [該方法可自行了解]自動(dòng)將參數(shù)轉(zhuǎn)為 Promise 實(shí)例,再進(jìn)一步處理。

說(shuō)那么多白話沒(méi)用,我們可以根據(jù)一個(gè)案例,就可以明白Promise.all()的用途了。

實(shí)際案例:
如果你想實(shí)現(xiàn)一個(gè)效果:在一個(gè)頁(yè)面中,等到頁(yè)面中所有的請(qǐng)求返回?cái)?shù)據(jù)后,再渲染頁(yè)面,該怎么實(shí)現(xiàn)呢?(在實(shí)際開(kāi)發(fā)中我們會(huì)看到loading加載頁(yè)面,等數(shù)據(jù)返回完后,loading加載頁(yè)面會(huì)消失,整個(gè)頁(yè)面就展現(xiàn)出來(lái)了,增強(qiáng)用戶的體驗(yàn)。)

實(shí)現(xiàn)思路:
通過(guò)Promise.all()方法,等多個(gè)接口全部接收到數(shù)據(jù)后,再統(tǒng)一進(jìn)行處理,然后渲染頁(yè)面

代碼如下:

console.log("顯示加載中") const q1 = pajax({     url:"http://localhost:3000/looplist" })  const q2 = pajax({     url:"http://localhost:3000/datalist" }) Promise.all([q1,q2]).then(res=>{     console.log(res)     console.log("隱藏加載中...") }).catch(err=>{     console.log(err) })
登錄后復(fù)制

代碼分析:

在上方代碼中,全局打印顯示加載中是代替loading的頁(yè)面,表示該頁(yè)面現(xiàn)在正是loading頁(yè)面中,等到q1q2所請(qǐng)求接口都得到返回的信息后,在then方法中接收收據(jù),并且可以進(jìn)行渲染頁(yè)面,同時(shí)隱藏了loading加載頁(yè)面!

小結(jié)

不論是在前端的項(xiàng)目開(kāi)發(fā)中還是在前端的面試過(guò)程中,Promise的地位就是舉足輕重的,雖然解決異步編程的終極解決方案是async和await,但是它們也是基于Promise封裝而來(lái)的,在以往文章中,我就說(shuō)過(guò),學(xué)習(xí)編程重要的是搞懂某個(gè)技術(shù)是怎么實(shí)現(xiàn)的,而不是做一個(gè)cv俠,多去思考,才能進(jìn)步。繼續(xù)加油吧,少年!

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
日韩国产在线一| 激情欧美国产欧美| 国产综合婷婷| 亚洲电影在线一区二区三区| 亚洲一区二区三区高清不卡| 丝袜美腿一区二区三区| 日韩精品免费观看视频| 91亚洲精品视频在线观看| 久久精品99久久久| 精品一级视频| 亚洲伦乱视频| 香蕉久久久久久久av网站| 日韩精品视频一区二区三区| 日韩欧美美女在线观看| 国产精品亚洲产品| 精品国产18久久久久久二百| 蜜桃成人精品| 亚洲专区一区| 日本视频一区二区| 福利一区二区三区视频在线观看| 久久婷婷一区| 日韩黄色av| 午夜精品久久久久久久久久蜜桃| 午夜精品一区二区三区国产| 99视频精品免费观看| 欧美日韩一区二区三区四区在线观看| 黄色欧美在线| 中文在线一区| 日韩精品久久久久久久软件91| 亚洲综合福利| 亚洲黄色网址| 亚洲精品进入| 成人啊v在线| 91久久精品无嫩草影院| 亚洲黄色网址| 亚洲不卡视频| 亚洲成人一区在线观看| 亚洲欧美专区| 国产精品久久观看| 日韩专区欧美专区| 亚洲国产福利| 国产亚洲人成a在线v网站| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲欧美网站| 欧美激情福利| 久热re这里精品视频在线6| 91视频久久| 日韩av不卡一区二区| 国产尤物精品| 久久久久久一区二区| 三级一区在线视频先锋| 日韩不卡一区| 欧美日韩99| 伊人久久婷婷| 红杏一区二区三区| 日本亚洲最大的色成网站www| 久久电影tv| 国产精品tv| 日韩影院精彩在线| 99精品综合| 91一区二区三区四区| 日韩不卡免费视频| 欧美特黄a级高清免费大片a级| 精品国内亚洲2022精品成人 | 久久一级电影| 成人一区不卡| 国产精品流白浆在线观看| 欧美精品黄色| 三上悠亚国产精品一区二区三区| 国产精成人品2018| 日韩一二三区在线观看| 亚洲欧洲一区| 亚洲一级高清| 91精品在线观看国产| 国产一区福利| 国产极品久久久久久久久波多结野 | 国产一区二区三区亚洲综合| 日本一区福利在线| 日本欧美在线看| 黄色国产精品| 国产精品av久久久久久麻豆网| 日韩不卡一区| 久久久久久久久成人| 亚洲精一区二区三区| 一区福利视频| 欧美特黄一区| 久久午夜视频| 亚洲一区日韩| 99国产精品久久久久久久| 蜜臀91精品国产高清在线观看 | 免费在线观看一区| 欧美日韩1区| 日本欧美在线| 国产精品永久| 国产精品任我爽爆在线播放| 91麻豆精品激情在线观看最新| 日韩福利视频一区| 日本成人在线一区| 国产日产精品一区二区三区四区的观看方式| 亚洲一区二区日韩| 亚洲精品少妇| 国产日韩一区二区三区在线播放| 奇米狠狠一区二区三区| 国产亚洲一区二区三区啪| 国产亚洲欧美日韩在线观看一区二区| 日韩av二区在线播放| 久久不见久久见中文字幕免费| 美女视频网站久久| 欧美丰满日韩| 欧美亚洲国产精品久久| 亚洲在线国产日韩欧美| 综合日韩在线| 欧美综合精品| 荡女精品导航| 亚洲午夜av| 亚洲一区二区av| 国产欧美69| 欧美日韩免费观看视频| 欧美精品一区二区久久| 夜夜精品视频| 亚洲精品在线a| 久久久久久久欧美精品| 四虎国产精品免费久久| 国产精品极品在线观看| 国产色播av在线| 99久久精品网| 免费在线观看一区二区三区| 7777精品| 神马久久午夜| 亚洲伊人精品酒店| 捆绑调教美女网站视频一区| 欧美一区二区三区高清视频| 亚洲区欧美区| 六月婷婷综合| 日韩欧美久久| 99免费精品| 欧美日韩18| 99久久亚洲精品蜜臀| 亚洲ww精品| 日韩电影免费在线观看| 香蕉久久久久久久av网站| 国产精品最新自拍| 欧美在线观看视频一区| 国产精品综合色区在线观看| 极品日韩av| 久久av免费看| 蜜臀久久99精品久久久久宅男| 麻豆精品av| 蜜臀久久99精品久久久久久9| 国产一区二区三区日韩精品| 视频一区视频二区中文| 国产在线观看www| 日韩av午夜在线观看| 欧美成人亚洲| 久久不见久久见免费视频7| 亚洲精品91| 国产精品sm| 综合一区av| 久久一区二区三区电影| 国产黄色精品| 亚洲开心激情| 视频小说一区二区| 精品国产18久久久久久二百| 综合色一区二区| 欧美日韩黑人| 日本а中文在线天堂| 亚洲2区在线| 欧美搞黄网站| 国产不卡一区| 国产欧美高清| 亚洲网址在线观看| 99久久www免费| 国产成人黄色| 国产亚洲欧美日韩在线观看一区二区| 婷婷亚洲综合| 免费高潮视频95在线观看网站| 国产精品美女午夜爽爽| 中文一区一区三区免费在线观| 久久中文亚洲字幕| 超级白嫩亚洲国产第一| 国产精品视频一区视频二区| 在线免费观看亚洲| av不卡在线| 五月天综合网站| 在线成人动漫av| 日韩欧美综合| 国产毛片精品久久| 欧美三级第一页| 日本欧美大码aⅴ在线播放| 亚洲在线久久| 最新亚洲国产| 亚洲免费一区三区| 国产精品毛片| 亚洲激情精品| 亚洲精品123区| 国产精品美女久久久浪潮软件| 国产一区欧美| 国产视频久久| 亚洲一区二区三区四区五区午夜| 中文欧美日韩|