成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Promise && async/await的理解和用法

王笑朝 / 1865人閱讀

摘要:但是中的這種情況與抽象反應(yīng)器模式如何描述完全不同。在處理一個(gè)階段之后并且在移到下一個(gè)隊(duì)列之前,事件循環(huán)將處理兩個(gè)中間隊(duì)列,直到中間隊(duì)列中沒有剩余的項(xiàng)目。如果沒有任務(wù)則循環(huán)退出,每一次隊(duì)列處理都被視為事件循環(huán)的一個(gè)階段。

Promise && async/await的理解和用法 為什么需要promise(承諾)這個(gè)東西
在之前我們處理異步函數(shù)都是用回調(diào)這個(gè)方法,回調(diào)嵌套的時(shí)候會(huì)發(fā)現(xiàn) 閱讀性 和 調(diào)試 的難度會(huì)增加很多;
怎么理解promise

想象一下,你把一個(gè)任務(wù)交給一個(gè)不錯(cuò)的小伙子,他叫承諾;不用擔(dān)心你交給他的任務(wù)會(huì)丟失,他總會(huì)返回的,做成功了resolve,失敗了reject;

var promise = new Promise((resolve, reject) =>{
    //交給給“承諾”同學(xué)一個(gè)異步任務(wù)
    setTimeout(()=>{
        if(true){
            // 成功了,返回params
            resolve("params")
        }else{
            // 失敗了,返回error
            reject("error")
        }
    }, 1000) 
})

// 上面是給承諾一個(gè)任務(wù),下面是"承諾"同學(xué)的返回
promise.then((res)=>{
    console.log(res)
}).catch((rej)=>{   
    console.log(res)
})
怎么使用promise

實(shí)際情況中,異步的場(chǎng)景沒有那么簡(jiǎn)單,你可以會(huì)遇到下面這些場(chǎng)景

“串行應(yīng)用場(chǎng)景”下的處理方案

let promise = new Promise((res, rej)=>{
    asyncFunc("promise", 1000, res, rej)
}) 

promise.then(res=>{
    console.log(res);
    return new Promise((res, rej)=>{
        asyncFunc("second", 2000, res, rej)
    })
}).then(res=>{
    console.log(res);
    return new Promise((res, rej)=>{
        asyncFunc("third", 1000, res, rej)
    })
    // throw "oh, no!";
}).then(res=>{
    console.log(res);
    console.log("endinggggggg")
}).catch(err=>{
    console.log("catch", err)
})

“并行應(yīng)用場(chǎng)景”的處理方案(即在所有的異步操作完成之后執(zhí)行)

let promise1 = new Promise((res, rej)=>{
    asyncFunc("promise1", 1000, res, rej)
})

let promise2 = new Promise((res, rej)=>{
    asyncFunc("promise2", 2000, res, rej)
})

let promise3 = new Promise((res, rej)=>{
    asyncFunc("promise3", 1000, res, rej)
})

var promiseAll = Promise.all([promise1, promise2, promise3])
promiseAll.then(res =>{
    console.log("最終的結(jié)果", res)
}).catch(err =>{
    console.log("catch", err);
})

“競(jìng)速模式下”,如字面意思,只要是哪一個(gè)提前完成了。就表示整個(gè)狀態(tài)處理完成狀態(tài);這個(gè)場(chǎng)景可以發(fā)散成如果是超過了3s我就不去做這件事情了

let promise1 = new Promise((res, rej)=>{
    asyncFunc("promise1", 1000, res, rej, true)
})

let promise2 = new Promise((res, rej)=>{
    asyncFunc("promise2", 2000, res, rej, true)
})

let promise3 = new Promise((res, rej)=>{
    asyncFunc("promise3", 1000, res, rej)
})

// 1000s的任務(wù)完成了,就直接返回promise1了
var promiseRace = Promise.race([promise1, promise2, promise3])
promiseRace.then(res =>{
    console.log("最終的結(jié)果", res)
}).catch(err =>{
    console.log("catch", err);
})
js是單線程,promise,setTimeout的執(zhí)行優(yōu)先級(jí)
講這一塊的東西就得講講nodejs的事件處理機(jī)制;   
事件隊(duì)列應(yīng)該是一個(gè)數(shù)據(jù)結(jié)構(gòu),所有的事情都被事件循環(huán)排隊(duì)和處理,直到隊(duì)列為空。但是Node中的這種情況與抽象反應(yīng)器模式如何描述完全不同。
下面講的東西只適合V8;

NodeJS中有許多隊(duì)列,其中不同類型的事件在自己的隊(duì)列中排隊(duì)。

在處理一個(gè)階段之后并且在移到下一個(gè)隊(duì)列之前,事件循環(huán)將處理兩個(gè)中間隊(duì)列,直到中間隊(duì)列中沒有剩余的項(xiàng)目。

定義:

有四種主要類型,由libuv事件循環(huán)處理;

過期的定時(shí)器和間隔隊(duì)列 - (比如使用setTimeout,setInterval);

IO事件隊(duì)列 - 已完成的IO事件

Immediates隊(duì)列 - 使用setImmediate功能添加回調(diào)

關(guān)閉處理程序隊(duì)列 - 任何close事件處理程序

還有2個(gè)中間隊(duì)列,不屬于libuv本身的一部分,但是是nodejs的一部分;

Next Ticks Queue - 使用process.nextTick 函數(shù)添加回調(diào);(優(yōu)先級(jí)更高)

其他微型任務(wù)隊(duì)列 - 包括其他微型任務(wù),例如已經(jīng)解決的承諾回調(diào);

如何工作的:

上圖是node中l(wèi)ibuv模塊在處理異步I/O操作的流程圖;

Node通過定時(shí)器檢查隊(duì)列中的任何過期定時(shí)器來啟動(dòng)事件循環(huán),并在每一個(gè)步驟中遍歷每一個(gè)隊(duì)列。如果沒有任務(wù)則循環(huán)退出,每一次隊(duì)列處理都被視為事件循環(huán)的一個(gè)階段。特別有意思的是中間紅色的隊(duì)列,每次階段都會(huì)優(yōu)先去處理中間隊(duì)列的任務(wù)。然后再去處理其他的隊(duì)列。

什么是async/await
async/await 可以是Generator和promise結(jié)合實(shí)現(xiàn)的;
注意核心點(diǎn):

asnyc 函數(shù)總是返回一個(gè)Promise對(duì)象,不論函數(shù)是否return Promise;

await 后面跟著Promise對(duì)象,如果不是Promise對(duì)象,也會(huì)被封裝成Promise;

async/await 和Promise對(duì)象在本質(zhì)上是一樣的

其他note點(diǎn)

await的任何內(nèi)容都通過Promise.resolve()傳遞,這樣就可以安全的await非原生Promise;

構(gòu)造函數(shù)以及getter/settings方法不能是異步的;

盡管編寫的是同步的代碼,但是也不要錯(cuò)失并行執(zhí)行的機(jī)會(huì),不然你需要消耗等待的性能喪失;

Babel REPL 說起來很有趣。試試就知道。

怎么用async/await
實(shí)際情況中,異步的場(chǎng)景沒有那么簡(jiǎn)單,你可以會(huì)遇到下面這些場(chǎng)景

場(chǎng)景:只有一個(gè)await并且 resolve

const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout));
async function f(){
    await delay(1000);
    await delay(2000);
    await delay(3000);
    return "done"
}
f().then(v=> console.log(v));

場(chǎng)景:只有一個(gè)await并且 reject

let a;
async function g(){
    await Promise.reject("error");
    a = await 1;
}
g().then(v=>console.log(v)).catch(err=>console.log(err));

場(chǎng)景:有多個(gè)await, 可以用try/catch

let a ;
async function g(){
    try{
        await Promise.reject("error")
    }catch(err){    
        console.log(err)
    }
    a= await 1;
    return a;
}

g().then(v=>console.log(v)).catch(err=>console.log(err));

場(chǎng)景:等待平行任務(wù)

async function series(){
    const await1 = delay(1000);
    const await2 = delay(1000);
    await await1;
    await await2;
    return "done"
}
series();
歡迎提意見和star

如果有不對(duì)的可以提issue
如果覺得對(duì)你有幫助可以star下
github

參考文檔

這一系列的文檔講的很不錯(cuò)

https://juejin.im/post/5b777f...

講promise,setTimeout優(yōu)先級(jí)的;nodejs中事件循環(huán)中的任務(wù)優(yōu)先級(jí)

https://jsblog.insiderattack....

developers.google.com域名下面的文檔還是很有質(zhì)量的,其中會(huì)比較全面的介紹怎么去用promise和async/await

https://developers.google.com...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108414.html

相關(guān)文章

  • setTimeout&Promise&Async之間愛恨情仇

    摘要:但是提出標(biāo)準(zhǔn),允許腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制。只是將事件插入了任務(wù)隊(duì)列,必須等到當(dāng)前代碼執(zhí)行棧執(zhí)行完,主線程才會(huì)去執(zhí)行它指定的回調(diào)函數(shù)。之后全局上下文進(jìn)入函數(shù)調(diào)用棧。 setTimeout 一、setTimeout 初現(xiàn) 定義:setTimeout() 方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。 語法: setTimeout(code, millisec...

    Half 評(píng)論0 收藏0
  • async & await & promise

    摘要:最近項(xiàng)目中用的比較多,所以特地去了解,模仿一下實(shí)現(xiàn)先來看看使用的方法通過是通過使用生成器配合方法模擬的一個(gè)同步操作,這個(gè)技術(shù)有效的避免了傳統(tǒng)回調(diào)和形成的回調(diào)地獄。 最近項(xiàng)目中 asyn & await 用的比較多,所以特地去了解,模仿一下實(shí)現(xiàn)~ 先來看看 使用 async & await 的方法 async function d () { try { const a = a...

    Dean 評(píng)論0 收藏0
  • async/await Promise 用例&關(guān)系

    摘要:和的關(guān)系和的關(guān)系非常的巧妙,必須在內(nèi)使用,并裝飾一個(gè)對(duì)象,返回的也是一個(gè)對(duì)象。的會(huì)使得的代碼節(jié)點(diǎn)自動(dòng)拋出相應(yīng)的異常,終止向下繼續(xù)執(zhí)行。示例方法內(nèi)無節(jié)點(diǎn)沒有修飾的方法內(nèi)有節(jié)點(diǎn)注意內(nèi)的對(duì)節(jié)點(diǎn)的作用。 假設(shè)我們有三個(gè)請(qǐng)求,req1,req2, req3,三個(gè)請(qǐng)求后者依賴前者的請(qǐng)求結(jié)果。我們先使用Promise封裝一個(gè)異步請(qǐng)求的方法。 Promise 異步請(qǐng)求 使用Promise可以非常容易的...

    y1chuan 評(píng)論0 收藏0
  • async & await (譯)

    摘要:的出現(xiàn),讓我們可以走出回調(diào)地獄,著實(shí)驚艷。我已經(jīng)開始使用里的和關(guān)鍵字來簡(jiǎn)化的處理。異步任務(wù)在這個(gè)例子是執(zhí)行之后,一直在執(zhí)行完成才繼續(xù)下一個(gè)任務(wù)并沒有產(chǎn)生阻塞。最后這個(gè)函數(shù)處理了返回值并且返回了一個(gè)對(duì)象。依然很棒,但和使得它可維護(hù)性更好。 JavaScript Promises的出現(xiàn),讓我們可以走出回調(diào)地獄,著實(shí)驚艷。Promises 允許我們更好的引入和處理異步任務(wù),雖然如此,但引入好...

    The question 評(píng)論0 收藏0
  • js異步從入門到放棄(實(shí)踐篇) — 常見寫法&面試題解析

    摘要:前文該系列下的前幾篇文章分別對(duì)不同的幾種異步方案原理進(jìn)行解析,本文將介紹一些實(shí)際場(chǎng)景和一些常見的面試題。流程調(diào)度里比較常見的一種錯(cuò)誤是看似串行的寫法,可以感受一下這個(gè)例子判斷以下幾種寫法的輸出結(jié)果辨別輸出順序這類題目一般出現(xiàn)在面試題里。 前文 該系列下的前幾篇文章分別對(duì)不同的幾種異步方案原理進(jìn)行解析,本文將介紹一些實(shí)際場(chǎng)景和一些常見的面試題。(積累不太夠,后面想到再補(bǔ)) 正文 流程調(diào)度...

    Awbeci 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<