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

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript:體驗(yàn)異步的優(yōu)雅解決方案

happyfish / 2019人閱讀

摘要:但是的的出現(xiàn)碉堡的新朋友,我們可以輕松寫(xiě)出同步風(fēng)格的代碼同時(shí)又擁有異步機(jī)制,可以說(shuō)是目前最簡(jiǎn)單,最優(yōu)雅,最佳的解決方案了。不敢說(shuō)這一定是終極的解決方案,但確實(shí)是目前最優(yōu)雅的解決方案

一、異步解決方案的進(jìn)化史

JavaScript的異步操作一直是個(gè)麻煩事,所以不斷有人提出它的各種解決方案??梢宰匪莸阶钤绲幕卣{(diào)函數(shù)(ajax老朋友),到Promise(不算新的朋友),再到ES6的Generator(強(qiáng)勁的朋友)。
幾年前我們可能用過(guò)一個(gè)比較著名的Async.js,但是它沒(méi)有擺脫回調(diào)函數(shù),并且錯(cuò)誤處理也是按照“回調(diào)函數(shù)的第一個(gè)參數(shù)用來(lái)傳遞錯(cuò)誤”這樣一個(gè)約定。而眾所周知的回調(diào)地獄仍然是一個(gè)比較突出的問(wèn)題,直到Generator改變了這種異步風(fēng)格。
但是ES7的async await的出現(xiàn)(碉堡的新朋友),我們可以輕松寫(xiě)出同步風(fēng)格的代碼同時(shí)又擁有異步機(jī)制,可以說(shuō)是目前最簡(jiǎn)單,最優(yōu)雅,最佳的解決方案了。

二、async await語(yǔ)法

async await語(yǔ)法比較簡(jiǎn)單,可以認(rèn)為是Generator的語(yǔ)法糖,比起星號(hào)和yield更具有語(yǔ)義化。下面一個(gè)簡(jiǎn)單的例子表示1秒之后輸出hello world:

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value)
}

asyncPrint("hello world", 1000);

await只能用在async函數(shù)中,如果用在普通函數(shù)就會(huì)報(bào)錯(cuò)

await后面跟的是一個(gè)Promise對(duì)象(當(dāng)然其它值也可以,但是會(huì)包裝成一個(gè)立即resolve的Promise,也就沒(méi)有意義了)

await會(huì)等待Promise的結(jié)果返回再繼續(xù)執(zhí)行

await等待的雖然是Promise對(duì)象,但是不必寫(xiě).then(),直接可以得到返回值,將上面的代碼微調(diào),發(fā)現(xiàn)返回值result也是可以輸出hello world:

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(_ => {resolve("hello world")}, ms);
  });
}

async function asyncPrint(ms) {
  let result = await timeout(ms);
  console.log(result)
}

asyncPrint(1000);
三、async await錯(cuò)誤處理

前面說(shuō)了await等待的雖然是Promise對(duì)象,但是不必寫(xiě).then(),所以其實(shí)也不用寫(xiě).catch()了,直接用try catch就能捕捉錯(cuò)誤,這樣可以避免錯(cuò)誤處理代碼非常冗余和笨重,還是將上面的例子微調(diào):

function timeout(ms) {
  return new Promise((resolve, reject) => {
    setTimeout(_ => {reject("error")}, ms);//reject模擬出錯(cuò),返回error
  });
}

async function asyncPrint(ms) {
  try {
     console.log("start");
     await timeout(ms);//這里返回了錯(cuò)誤
     console.log("end");//所以這句代碼不會(huì)被執(zhí)行了
  } catch(err) {
     console.log(err); //這里捕捉到錯(cuò)誤error
  }
}

asyncPrint(1000);

如果有多個(gè)await,可以一起放在try catch中:

async function main() {
  try {
    const async1 = await firstAsync();
    const async2 = await secondAsync();
    const async3 = await thirdAsync();
  }
  catch (err) {
    console.error(err);
  }
}
四、async await注意點(diǎn)

1). 前面已經(jīng)說(shuō)過(guò),await命令后面的Promise對(duì)象,運(yùn)行結(jié)果很可能是reject或邏輯報(bào)錯(cuò),所以最好把a(bǔ)wait放在try catch代碼塊中。
2). 多個(gè)await命令的異步操作,如果不存在依賴(lài)關(guān)系,讓它們同時(shí)觸發(fā)。

const async1 = await firstAsync();
const async2 = await secondAsync();

上面代碼中,async1和async2如果是兩個(gè)獨(dú)立的異步操作,這樣寫(xiě)會(huì)比較耗時(shí),因?yàn)橹挥衒irstAsync完成以后,才會(huì)執(zhí)行secondAsync,完全可以用Promise.all優(yōu)雅地處理:

let [async1, async2] = await Promise.all([firstAsync(), secondAsync()]);

3). await只能用在async函數(shù)之中,如果用在普通函數(shù)就會(huì)報(bào)錯(cuò):

async function main() {
  let docs = [{}, {}, {}];

  //報(bào)錯(cuò) await is only valid in async function
  docs.forEach(function (doc) {
    await post(doc);
    console.log("main");
  });
}
function post(){
  return new Promise((resolve) => {
    setTimeout(resolve, 1000);
  });
}

在forEach內(nèi)部方法加上async就可以了:

async function main() {
  let docs = [{}, {}, {}];

  docs.forEach(async function (doc) {
    await post(doc);
    console.log("main");
  });
}
function post(){
  return new Promise((resolve) => {
    setTimeout(resolve, 1000);
  });
}

但是你會(huì)發(fā)現(xiàn)3個(gè)main是同時(shí)輸出的,這就說(shuō)明post是并發(fā)執(zhí)行的,而不是繼發(fā)執(zhí)行,改成for就可以解決問(wèn)題,3個(gè)main是分別相隔1秒輸出:

async function main() {
  let docs = [{}, {}, {}];

  for (let doc of docs) {
    await post(doc);
    console.log("main");
  }
}
function post(){
  return new Promise((resolve) => {
    setTimeout(resolve, 1000);
  });
}

總之,用了async await之后整個(gè)人神清氣爽,可以用非常簡(jiǎn)潔和優(yōu)雅的代碼實(shí)現(xiàn)各種花式異步操作,并且在業(yè)務(wù)邏輯復(fù)雜的情況下可以不用陷入回調(diào)地獄中。不敢說(shuō)這一定是終極的解決方案,但確實(shí)是目前最優(yōu)雅的解決方案!

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

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

相關(guān)文章

  • JavaScript優(yōu)雅實(shí)現(xiàn)順序執(zhí)行異步函數(shù)

    摘要:順序執(zhí)行異步函數(shù)異步為帶來(lái)非阻塞等優(yōu)勢(shì)的同時(shí),同時(shí)也在一些場(chǎng)景下帶了不便,如順序執(zhí)行異步函數(shù),下面總結(jié)了一些常用的方法。 火于異步 1995年,當(dāng)時(shí)最流行的瀏覽器——網(wǎng)景中開(kāi)始運(yùn)行 JavaScript (最初稱(chēng)為 LiveScript)。 1996年,微軟發(fā)布了 JScript 兼容 JavaScript。隨著網(wǎng)景、微軟競(jìng)爭(zhēng)而不斷的技術(shù)更新,在 2000年前后,JavaScript ...

    monw3c 評(píng)論0 收藏0
  • JS筆記

    摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。異步編程入門(mén)的全稱(chēng)是前端經(jīng)典面試題從輸入到頁(yè)面加載發(fā)生了什么這是一篇開(kāi)發(fā)的科普類(lèi)文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門(mén)教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...

    rottengeek 評(píng)論0 收藏0
  • JavaScript 異步

    摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。寫(xiě)一個(gè)符合規(guī)范并可配合使用的寫(xiě)一個(gè)符合規(guī)范并可配合使用的理解的工作原理采用回調(diào)函數(shù)來(lái)處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問(wèn)題描述 在開(kāi)發(fā)過(guò)程中,遇到一個(gè)需求:在系統(tǒng)初始化時(shí)通過(guò)http獲取一個(gè)第三方服務(wù)器端的列表,第三方服務(wù)器提供了一個(gè)接口,可通過(guò)...

    tuniutech 評(píng)論0 收藏0
  • async 更優(yōu)雅異步體驗(yàn)

    摘要:文章同步自個(gè)人博客上一篇讓自啟動(dòng)介紹了通過(guò)起動(dòng)器讓跑起來(lái),而本篇采用實(shí)現(xiàn)更優(yōu)雅的異步編程。而采用寫(xiě),代碼則是直接運(yùn)行即可直接運(yùn)行了,無(wú)須寫(xiě)生成器來(lái)運(yùn)行了,而代碼僅僅是改為改為而已。不過(guò)效果確實(shí)非常好,讓異步編程更加的同步了。 文章同步自個(gè)人博客:http://www.52cik.com/2016/07/11/generator-co.html 上一篇《讓 Generator 自啟動(dòng)》介...

    Ajian 評(píng)論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書(shū)了入門(mén),覺(jué)得看看這本書(shū)就足夠了。前端的異步解決方案之和異步編程模式在前端開(kāi)發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(shū)(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書(shū)的目的是以目前還在制定中的ECMASc...

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

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

0條評(píng)論

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