国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

async & await (譯)

The question / 622人閱讀

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

JavaScript Promises的出現(xiàn),讓我們可以走出回調(diào)地獄,著實(shí)驚艷。Promises 允許我們更好的引入和處理異步任務(wù),雖然如此,但引入好多的 then 還是會(huì)讓代碼變的混亂。我已經(jīng)開(kāi)始使用 ES2017 里的 asyncawait 關(guān)鍵字來(lái)簡(jiǎn)化 promises 的處理。讓我們一睹 asyncawait 的風(fēng)采!

快速入門

async 是函數(shù)聲明的關(guān)鍵字

await 用于 promises 處理過(guò)程中

await 必須用在 async 聲明的函數(shù)內(nèi)部,雖然 Chrome 已經(jīng)支持“頂級(jí)的”的 await

async 函數(shù)返回 promises 對(duì)象,不關(guān)心函數(shù)的返回值是什么

async/await 和 promises 的底層實(shí)現(xiàn)是一樣的

大多數(shù)瀏覽器和 Nodejs 已經(jīng)可用

asyncawait 的好處

代碼更加清晰簡(jiǎn)潔

更少的回調(diào),調(diào)試更加簡(jiǎn)單

容易從 promises 中的 then / catch 轉(zhuǎn)換

代碼看起來(lái)自上而下,更少的縮進(jìn)。

asyncawait 簡(jiǎn)介

從實(shí)例入手要更簡(jiǎn)單,我們先來(lái)看一個(gè)簡(jiǎn)單的 async/await 的使用方法:

// 使用 async 定義函數(shù),然后 await 才能使用
async function fetchContent() {
  // Instead of using fetch().then, use await
  let content = await fetch("/");
  let text = await content.text();
  
  // async 函數(shù)內(nèi),text 是響應(yīng)值
  console.log(text);

  // Resolve this async function with the text
  return text;
}

// Use the async function
var promise = fetchContent().then(...);

首先使用 async 聲明函數(shù);聲明之后,await 可以用在該函數(shù)內(nèi)部。await 關(guān)鍵字后面跟 promise:fetch API。異步任務(wù)(在這個(gè)例子是 fetch)執(zhí)行之后,一直在執(zhí)行完成才繼續(xù)下一個(gè)任務(wù)(并沒(méi)有產(chǎn)生阻塞)。最后這個(gè)函數(shù)處理了返回值并且返回了一個(gè) promises 對(duì)象。

代碼自上而下,告別回調(diào),異步處理變的更加簡(jiǎn)單!

轉(zhuǎn)換 Promise 為 await

當(dāng)時(shí)間允許,你一定很想將你的 promise 的代碼升級(jí)到 await,讓我們看下該怎么做:

// Before: callback city!
fetch("/users.json")
  .then(response => response.json())
  .then(json => {
    console.log(json);
  })
  .catch(e => { console.log("error!"); })

// After: no more callbacks!
async function getJson() {
  try {
    let response = await fetch("/users.json");
    let json = await response.json();
    console.log(json);
  }
  catch(e) {
    console.log("Error!", e);
  }
}

從使用多個(gè) thenawait 十分簡(jiǎn)單,但你的代碼的維護(hù)性變得很高。

async / await 模式

聲明 async 函數(shù)有以下方式:

匿名 Async 函數(shù)
let main = (async function() {
  let value = await fetch("/");
})();
Async 函數(shù)聲明
async function main() {
  let value = await fetch("/");
};
Async 函數(shù)賦值
let main = async function() {
  let value = await fetch("/");
};

// Arrow functions too!
let main = async () => {
  let value = await fetch("/");
};
Async 函數(shù)作為參數(shù)
document.body.addEventListener("click", async function() {
  let value = await fetch("/");
});
對(duì)象和類方法
// Object property
let obj = {
  async method() {
    let value = await fetch("/");
  }
};

// Class methods
class MyClass {
  async myMethod() {
    let value = await fetch("/");
  }
}

正如你看到的,增加 async 函數(shù)十分簡(jiǎn)單,而且能很好的適用各種函數(shù)創(chuàng)建的流程。

錯(cuò)誤處理

傳統(tǒng)的 promises 允許使用 catch 回調(diào)處理 rejection,當(dāng)你使用 await,最好使用 try/catch

try {
  let x = await myAsyncFunction();
}
catch(e) {
 // Error!
}

老式的 try/catch 不如 promises 的 catch 優(yōu)雅,但在這里,它很給力!

并行

Google 的Jake Archibald在Async functions document中提出了一個(gè)完美的觀點(diǎn):不要用 await 使得任務(wù)變的太序列化。也就是說(shuō)對(duì)于可以同時(shí)執(zhí)行的任務(wù),先觸發(fā)任務(wù)然后再使用 await,而不是直接使用 await 使得任務(wù)像堆棧式一樣的存儲(chǔ)。

// Will take 1000ms total!
async function series() {
  await wait(500);
  await wait(500);
  return "done!";
}

// Would take only 500ms total!
async function parallel() {
  const wait1 = wait(500);
  const wait2 = wait(500);
  await wait1;
  await wait2;
  return "done!";
}

第一個(gè)代碼塊反面例子,第二個(gè) await 需要等待第一個(gè) await 執(zhí)行完畢后才執(zhí)行,第二個(gè)代碼塊是一個(gè)更好的方法,同時(shí)觸發(fā)了兩個(gè)任務(wù),然后才使用 await;這樣做可以使得多個(gè)異步操作同時(shí)執(zhí)行!

Promise.all 等價(jià)方式

Primises API 中我最愛(ài)的 API 之一就是 Promise.all:當(dāng)多有任務(wù)完成后才會(huì)觸發(fā)回調(diào)。async / await 中沒(méi)有等價(jià)的操作,但是這篇文章提供了一個(gè)很好的解決方案:

let [foo, bar] = await Promise.all([getFoo(), getBar()]);

請(qǐng)記住,async / await和 promises 在底層實(shí)現(xiàn)上是一致的,所以我們可以簡(jiǎn)單的等待(await)所有的 promises 任務(wù)結(jié)束!

現(xiàn)在大多數(shù)瀏覽器都可以使用 asyncawait,Nodejs 一樣可用,老版本的Nodejs可以使用 transform-async-to-generator 這個(gè) babel 插件來(lái)使用 asyncawait。Promises 依然很棒,但 asyncawait 使得它可維護(hù)性更好。

原文地址:https://davidwalsh.name/async...

博客原地址:http://zhaojizong.online/post...

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91815.html

相關(guān)文章

  • []async-await 數(shù)組循環(huán)的幾個(gè)坑

    摘要:譯數(shù)組循環(huán)的幾個(gè)坑原文地址原文作者在循環(huán)中使用循環(huán)遍歷數(shù)組似乎很簡(jiǎn)單,但是在將兩者結(jié)合使用時(shí)需要注意一些非直觀的行為。循環(huán)的情況問(wèn)題如上述代碼能夠正常執(zhí)行。但我還是喜歡循環(huán)帶來(lái)的簡(jiǎn)潔和高可讀性。 [譯]async-await 數(shù)組循環(huán)的幾個(gè)坑 原文地址:https://medium.com/dailyjs/th... 原文作者:Tory Walker 在 Javascript 循...

    warkiz 評(píng)論0 收藏0
  • []帶你理解 Async/await

    摘要:所以是在一秒后顯示的。這個(gè)行為不會(huì)耗費(fèi)資源,因?yàn)橐婵梢酝瑫r(shí)處理其他任務(wù)執(zhí)行其他腳本,處理事件等。每個(gè)回調(diào)首先被放入微任務(wù)隊(duì)列然后在當(dāng)前代碼執(zhí)行完成后被執(zhí)行。,函數(shù)是異步的,但是會(huì)立即運(yùn)行。否則,就返回結(jié)果,并賦值。 「async/await」是 promises 的另一種更便捷更流行的寫法,同時(shí)它也更易于理解和使用。 Async functions 讓我們以 async 這個(gè)關(guān)鍵字開(kāi)...

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

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

    Dean 評(píng)論0 收藏0
  • Promise && async/await的理解和用法

    摘要:但是中的這種情況與抽象反應(yīng)器模式如何描述完全不同。在處理一個(gè)階段之后并且在移到下一個(gè)隊(duì)列之前,事件循環(huán)將處理兩個(gè)中間隊(duì)列,直到中間隊(duì)列中沒(méi)有剩余的項(xiàng)目。如果沒(méi)有任務(wù)則循環(huán)退出,每一次隊(duì)列處理都被視為事件循環(huán)的一個(gè)階段。 Promise && async/await的理解和用法 為什么需要promise(承諾)這個(gè)東西 在之前我們處理異步函數(shù)都是用回調(diào)這個(gè)方法,回調(diào)嵌套的時(shí)候會(huì)發(fā)現(xiàn) 閱讀...

    王笑朝 評(píng)論0 收藏0

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

0條評(píng)論

閱讀需要支付1元查看
<