[英]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.