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

資訊專欄INFORMATION COLUMN

async & await (譯)

The question / 631人閱讀

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

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

快速入門

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

await 用于 promises 處理過程中

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

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

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

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

asyncawait 的好處

代碼更加清晰簡潔

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

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

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

asyncawait 簡介

從實(shí)例入手要更簡單,我們先來看一個簡單的 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ù)(在這個例子是 fetch)執(zhí)行之后,一直在執(zhí)行完成才繼續(xù)下一個任務(wù)(并沒有產(chǎn)生阻塞)。最后這個函數(shù)處理了返回值并且返回了一個 promises 對象。

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

轉(zhuǎn)換 Promise 為 await

當(dāng)時間允許,你一定很想將你的 promise 的代碼升級到 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);
  }
}

從使用多個 thenawait 十分簡單,但你的代碼的維護(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("/");
});
對象和類方法
// Object property
let obj = {
  async method() {
    let value = await fetch("/");
  }
};

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

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

錯誤處理

傳統(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中提出了一個完美的觀點(diǎn):不要用 await 使得任務(wù)變的太序列化。也就是說對于可以同時執(zhí)行的任務(wù),先觸發(fā)任務(wù)然后再使用 await,而不是直接使用 await 使得任務(wù)像堆棧式一樣的存儲。

// 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!";
}

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

Promise.all 等價方式

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

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

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

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

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

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

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

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

相關(guān)文章

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

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

    warkiz 評論0 收藏0
  • []帶你理解 Async/await

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

    xiaochao 評論0 收藏0
  • async & await & promise

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

    Dean 評論0 收藏0
  • Promise && async/await的理解和用法

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

    王笑朝 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<