Javascript的異步函數(shù)和Promise對象你了解嗎_第1頁
Javascript的異步函數(shù)和Promise對象你了解嗎_第2頁
Javascript的異步函數(shù)和Promise對象你了解嗎_第3頁
Javascript的異步函數(shù)和Promise對象你了解嗎_第4頁
Javascript的異步函數(shù)和Promise對象你了解嗎_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第Javascript的異步函數(shù)和Promise對象你了解嗎目錄1、JS中的異步1.1同步1.2異步1.3回調(diào)函數(shù)解決異步問題1.4回調(diào)地獄2、Promise對象2.1Promise的基本使用2.2async和await總結(jié)

1、JS中的異步

1.1同步

一般情況下,js的代碼都是自上而下順序運(yùn)行的。例如:

letres='';

res='獲取到的結(jié)果!';

console.log(res);

結(jié)果:

很容易理解,我給res賦了新值,然后輸出res。這就是js的同步執(zhí)行,這里的同步,并不是一起執(zhí)行的意思,而是在一個線程里順序執(zhí)行的意思。因為JavaScript是單線程,所以所有程序都應(yīng)該在一個線程里運(yùn)行。

1.2異步

但是有的時候,我們獲取res的值是需要一點時間的,例如使用ajax向服務(wù)器發(fā)起請求,服務(wù)器響應(yīng)以后返回結(jié)果,我們再將結(jié)果賦值給res。

這里使用setTimeout函數(shù)模擬數(shù)據(jù)請求,setTimeout也是一個異步函數(shù)。

letres='';

setTimeout(()={

res='獲取到的結(jié)果!';

console.log('獲取到結(jié)果了!',res);

},3000);

console.log('res',res);

可以看到,沒有立刻獲取到結(jié)果,而是3s后才獲取到結(jié)果。

為什么會這樣呢?

由于獲取res它是一個異步操作,所以它會被分為兩部分來執(zhí)行,先調(diào)用setTimeout方法,然后把要執(zhí)行的函數(shù)放到一個隊列中。代碼繼續(xù)往下執(zhí)行,當(dāng)把所有的代碼都執(zhí)行完后,放到隊列中的函數(shù)才會被執(zhí)行。因為js的單線程機(jī)制,不允許它花費時間去等待異步函數(shù)的結(jié)果。

1.3回調(diào)函數(shù)解決異步問題

既然異步函數(shù)的結(jié)果會再最后獲取,那么我們就可以給異步函數(shù)中加一個回調(diào)函數(shù),來處理獲取到的數(shù)據(jù)。

letres='';

setTimeout(()={

res='獲取到的結(jié)果!';

callback();

},3000);

functioncallback(){

console.log('獲取到結(jié)果了!',res);

console.log('處理結(jié)果!');

console.log('res',res);

現(xiàn)在console.log(res,res);仍然沒有獲取到res,但是我們已經(jīng)不需要它了,我們獲取res的就是為了處理它,而使用callback函數(shù)就可以達(dá)到目的了!

1.4回調(diào)地獄

1.3了解了可以通過調(diào)用函數(shù)解決無法獲取結(jié)果的問題,但是它仍然是存在缺點的,如果只獲取一次結(jié)果,那還好。但是如果我們在獲取結(jié)果之后,還需要利用獲取的結(jié)果再進(jìn)行異步操作,那么又需要嵌套一層,又需要一次異步操作,再嵌套一層

setTimeout(function(){

console.log("first");

setTimeout(function(){

console.log("second");

setTimeout(function(){

console.log("third");

setTimeout(function(){

console.log("fourth");

},2000);

},2000);

},2000);

},2000);

雖然上述代碼會按照我們預(yù)期的方向運(yùn)行,但是多層的嵌套讓代碼閱讀和維護(hù)起來十分的困難。

2、Promise對象

2.1Promise的基本使用

為了解決異步中的回調(diào)地獄問題,ES6引入了Promise對象,使得我們可以十分優(yōu)雅地進(jìn)行異步操作。

從語法上來說,Promise是一個對象,從它可以獲取異步操作的消息。

lettimeout=function(time){

returnnewPromise(function(resolve,reject){

setTimeout(function(){

resolve();

},time);

console.log("開始運(yùn)行!");

timeout(2000).then(function(){

console.log("first");

returntimeout(2000);

}).then(function(){

console.log("second");

returntimeout(2000);

}).then(function(){

console.log("third");

returntimeout(2000);

}).then(function(){

console.log("fourth");

returntimeout(2000);

這樣就解決了上述的回調(diào)地獄的問題。并且then也很容易理解,就是上一個異步函數(shù)執(zhí)行完成后,接著要進(jìn)行的操作。

同時Promise對象也可以通過resolve和reject傳遞參數(shù):

letres=null;

lettimeout=function(time){

returnnewPromise(function(resolve,reject){

setTimeout(function(){

res=false;

if(res){

resolve('res為true');

}else{

reject('res為false');

},time);

timeout().then((res)={

console.log(res);

}).catch((error)={

console.log(error);

這樣就可以根據(jù)res的值來確定結(jié)果了。resolve()對應(yīng)then的結(jié)果,而reject()對應(yīng)catch的結(jié)果。這在axios的請求操作中是十分常見的。

2.2async和await

mdn描述如下:

async函數(shù)是使用async關(guān)鍵字聲明的函數(shù)。async函數(shù)是AsyncFunction構(gòu)造函數(shù)的實例,并且其中允許使用await關(guān)鍵字。async和await關(guān)鍵字讓我們可以用一種更簡潔的方式寫出基于Promise的異步行為,而無需刻意地鏈?zhǔn)秸{(diào)用promise。

async和await的關(guān)系:

async函數(shù)可能包含0個或者多個await表達(dá)式。await表達(dá)式會暫停整個async函數(shù)的執(zhí)行進(jìn)程并出讓其控制權(quán),只有當(dāng)其等待的基于promise的異步操作被兌現(xiàn)或被拒絕之后才會恢復(fù)進(jìn)程。promise的解決值會被當(dāng)作該await表達(dá)式的返回值。使用async/await關(guān)鍵字就可以在異步代碼中使用普通的try/catch代碼塊。

functiongetProcessedData(url){

returndownloadData(url)//返回一個promise對象

.catch(e={

returndownloadFallbackData(url)//返回一個promise對象

.then(v={

returnprocessDataInWorker(v);//返回一個promise對象

使用async和await重寫上述函數(shù)。

asyncfunctiongetProcessedData(url){

letv;

try{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論