簡體   English   中英

javascript async等待Web應用程序是否良好

[英]Is javascript async await good for web applications

在使用新的javascript語法閱讀一些異步/等待示例時,我發現了以下代碼示例:

const axios = require('axios'); // promised based requests - like fetch()

function getCoffee() {
  return new Promise(resolve => {
    setTimeout(() => resolve('☕'), 2000); // it takes 2 seconds to make coffee
  });
}

async function go() {
  try {
    // but first, coffee
    const coffee = await getCoffee();
    console.log(coffee); // ☕
    // then we grab some data over an Ajax request
    const wes = await axios('https://api.github.com/users/wesbos');
    console.log(wes.data); // mediocre code
    // many requests should be concurrent - don't slow things down!
    // fire off three requests and save their promises
    const wordPromise = axios('http://www.setgetgo.com/randomword/get.php');
    const userPromise = axios('https://randomuser.me/api/');
    const namePromise = axios('https://uinames.com/api/');
    // await all three promises to come back and destructure the result into their own variables
    const [word, user, name] = await Promise.all([wordPromise, userPromise, namePromise]);
    console.log(word.data, user.data, name.data); // cool, {...}, {....}
  } catch (e) {
    console.error(e); // 💩
  }
}

go();

尚不清楚的一件事(在鏈接的示例中,整個腳本等待coffee函數返回),這似乎是async / await是阻止操作? 如果是這種情況,這是否意味着對節點Web應用程序不是一個好主意?

我剛剛被一個使用AWS DynomoDB的項目所吸引,該項目的所有操作的抽象類都在async / await之后...如果這阻塞了,那肯定會破壞性能嗎?

等待阻止! ..

await確實使您的代碼等待。 當您還在等待時,沒有一種魔術可以讓等待后的代碼運行。 在此示例中,直到咖啡煮熟后,才會觸發那些ajax請求。

..但它可以等待多個異步作業。

但是,您可以等待多個異步進程。 您在某個時候發布的示例將同時觸發三個Ajax請求,並在所有這些請求都被觸發后才等待它們。 這些請求將並行執行。

..您只需要在需要答案時等待

關鍵是您以異步方式開始某件事,最終將結束(承諾!)。 您可以在確實需要等待該調用結果的時間(最好僅在該時間)調用await。 因此,如果使用await調用每個異步方法,則效果消失了,但是如果調用它們,則將promise存儲在變量中,然后在最后等待它們,那么您將並行運行長操作。 該示例顯示了“不好”的用法(先喝咖啡,直到完成后才去上班),然后再是好的用法(同時執行三個請求)。

您可以通過僅等待咖啡和最后的第一個請求來“優化”該示例,就像它等待其他請求一樣,因此它並行執行5件事而不是3件事。這僅在您不需要第一個異步函數的結果。

..並且等待僅阻止您,而不阻止您的呼叫者

我之前說過,立即調用一個同步功能是不好的。 並非總是如此,因為您只能在本身異步的函數中使用await ,因此不會阻塞函數的調用方(除非它也調用await)。

因此,例如,您可以創建一個簡單的函數來獲取某些數據,該函數使用await AjaxShizzleGoesHere()包裝更復雜的Ajax調用。 即使您的函數只是調用另一件事並等待它,仍然可以並行運行它。 您的函數必須等待Ajax調用返回(因此它使用await並被阻止),但是函數的調用者不必立即等待結果,並且可以首先啟動其他異步函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM