最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于對(duì)async?await效率問(wèn)題的深入思考

 更新時(shí)間:2022年01月29日 09:47:43   作者:kamesan  
這篇文章主要給大家介紹了關(guān)于對(duì)async?await效率問(wèn)題的深入思考,async和await要搭配Promise使用,它進(jìn)一步極大的改進(jìn)了Promise的寫(xiě)法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

關(guān)于async await

async await于ES2017標(biāo)準(zhǔn)引入,本身的功能是作為語(yǔ)法糖簡(jiǎn)化寫(xiě)法的。

下面列舉一個(gè)使用promise的例子:

 function myPromise(flag) {
     return new Promise((resolve, reject) => {
         if (flag) {
             return resolve(flag)
         } else {
             return reject('error')
         }
     })
 }
 // 在p1的回調(diào)調(diào)用p2
 const p1 = myPromise(1)
 p1.then(v => {
     const p2 = myPromise(2)
     p2.then(v => {
         console.log(v)
     })
 })

因?yàn)閜2的參數(shù)與p1的返回值有關(guān)這個(gè)例子確保了p2在p1的promise為成功的情況下再調(diào)用,確保了調(diào)用的順序,如果只有少許的順序要求,實(shí)現(xiàn)起來(lái)結(jié)構(gòu)還不至于非常復(fù)雜,如果后續(xù)需要確保多個(gè)promise的調(diào)用順序,那么就會(huì)有很多層.then去調(diào)用promise會(huì)導(dǎo)致代碼嵌套太多,可讀性差。

async await的出現(xiàn)解決了代碼可讀性的問(wèn)題。

下面是一個(gè)例子:

 function myPromise(flag) {
     return new Promise((resolve, reject) => {
         if (flag) {
             return resolve(flag)
         } else {
             return reject('error')
         }
     })
 }
 let v
 const p1 = await myPromise(1)
 p1.then(val => { v = val }) 
 const p2 = await myPromise(v)
 p2.then(val => { v = val })
 const p3 = await myPromise(v)
 p3.then(val => { v = val })
 const p4 = await myPromise(v)
 p4.then(val => { v = val })
 const p5 = await myPromise(v)
 p5.then(val => { v = val })
 const p6 = await myPromise(v)
 p6.then(val => { v = val })
 const p7 =  myPromise(v)

這樣就可以不依靠大量的.then嵌套去確保異步方法的調(diào)用順序。

效率問(wèn)題的思考

下面給大家看一段偽代碼:

 function getData(url) {
     return url
 }
 ?
 function postData(url) {
     console.log(url)
 }
 ?
 let data1 = await getData('/xxx') // 操作1 需要花費(fèi)10s
 let data2 = await getData('/xxx') // 操作2 需要花費(fèi)10s
 postData(data1 + '/xxx') // 操作3 需要花費(fèi)20s
 postData(data2 + '/yyy') // 操作4 需要花費(fèi)5s

熟悉js事件循環(huán)的同學(xué)應(yīng)該能很快求出執(zhí)行所需的時(shí)間,總共需要40s去執(zhí)行,那么對(duì)于這個(gè)偽代碼我們可以做出優(yōu)化嗎?答案是可以的。

下面看一下優(yōu)化后的代碼:

 function getData(url) {
     return url
 }
 ?
 function postData(url) {
     console.log(url)
 }
 ?
 let data1 = await getData('/xxx') // 操作1 需要花費(fèi)10s
 postData(data1 + '/xxx') // 操作4 需要花費(fèi)20s
 let data2 = await getData('/xxx') // 操作2 需要花費(fèi)10s
 postData(data2 + '/yyy') // 操作3 需要花費(fèi)5s

這樣的話(huà)執(zhí)行時(shí)間就被優(yōu)化到了30s,我們可以看一下二者的執(zhí)行時(shí)的對(duì)比:

第一個(gè)方式

第二個(gè)方式

所以當(dāng)我們使用async await時(shí)還是要去注意一下異步代碼的調(diào)用順序,適當(dāng)?shù)膬?yōu)化可以減少程序的運(yùn)行時(shí)間,而且我們應(yīng)正確的使用async await語(yǔ)法糖,只有后續(xù)操作需要用到異步請(qǐng)求所得到的數(shù)據(jù)時(shí)才需要為異步請(qǐng)求加上await修飾確保數(shù)據(jù)能夠獲取,否則不需要加await修飾。

后續(xù)

雖然可能大家覺(jué)得這個(gè)題目比較標(biāo)題黨,但我沒(méi)有要深度剖析的意思,只是想交流討論一下,希望大家的評(píng)論還是客氣一點(diǎn)。 關(guān)于評(píng)論區(qū)有掘友指出我的理解有問(wèn)題,這里我用setTimeout控制一下Promise的返回時(shí)間,代碼如下

function t5s() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1)
            console.log('5s')
        }, 5000);
    })
}
function t3s() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1)
            console.log('3s')
        }, 3000);
    })
}
function t2s() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(1)
            console.log('2s')
        }, 2000);
    })
}
/* 
    這里應(yīng)該是等待5s后返回第一個(gè)Promise并打印5s,然后再等待3s后返回第二個(gè)Promise并打印3s,
    最后再等待2s后返回第三個(gè)Promise并打印2s,總用時(shí)10s
*/
(async () => {
    await t5s()
    await t3s()
    await t2s()
})()
/*
    這里我的理解是3個(gè)操作會(huì)依次進(jìn)入微任務(wù)池中依次執(zhí)行,因此2s后打印2s,3s后打印3s,5s后打印5s,總用時(shí)5s
*/
(() => {
    t5s()
    t3s()
    t2s()
})()

總結(jié)

到此這篇關(guān)于對(duì)async await效率問(wèn)題的深入思考的文章就介紹到這了,更多相關(guān)async await效率問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

呼伦贝尔市| 遂溪县| 文昌市| 厦门市| 福鼎市| 鄢陵县| 南部县| 台东县| 庆云县| 原阳县| 蕲春县| 清丰县| 仙居县| 普宁市| 永州市| 祁门县| 永嘉县| 建德市| 成安县| 子长县| 孝昌县| 东辽县| 石河子市| 肇州县| 通州区| 广安市| 利津县| 临沭县| 搜索| 迁西县| 望城县| 商都县| 丰顺县| 乐亭县| 乐安县| 民权县| 深水埗区| 临邑县| 绥阳县| 安福县| 新巴尔虎左旗|