gpt4 book ai didi

javascript - javascript async wait 对 Web 应用程序有好处吗

转载 作者:行者123 更新时间:2023-12-01 02:58:29 24 4
gpt4 key购买 nike

在阅读一些使用新 JavaScript 语法的 async/await 示例时,我发现了以下代码示例:

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();

有一点不清楚(在链接的示例中,整个脚本等待咖啡函数返回),似乎 async/await 是一个阻塞操作?如果是这种情况,这是否意味着这对于 Node Web 应用程序来说是一个坏主意?

我刚刚被投入一个使用 AWS DynomoDB 的项目,其所有操作的抽象类都位于 async/await 后面......如果这是阻塞的,这肯定会破坏性能?

最佳答案

等待确实阻塞! ..

await 确实让你的代码等待。没有什么魔法可以让等待之后的代码在您仍在等待时运行。在示例中,在咖啡喝完之前,这些 ajax 请求不会被触发。

..但它可以等待多个异步作业..

但是,您可以等待多个异步进程。您在某个时刻发布的示例会同时触发三个 Ajax 请求,并且仅在它们全部被触发后才等待这些请求。这些请求将并行执行。

..只有在需要答案时才需要等待

重点是你异步地开始一些事情,这最终会结束(保证!)。当(最好仅当)您确实需要等待该调用的结果时,您可以调用await。因此,如果您使用await 调用每个异步方法,那么效果就会消失,但如果您调用它们,将promise 存储在变量中,然后在最后等待它们,那么您将并行运行长操作。该示例显示了“不良”用途(喝咖啡,直到完成后才开始工作),然后是良好用途(同时执行三个请求)。

您可以通过仅等待咖啡和最后的第一个请求来“优化”该示例,就像它等待其他请求一样,因此它并行执行 5 件事,而不是 3 件事。这只在您不这样做时才有效下一个异步函数不需要第一个异步函数的结果。

..并且await只会阻止你,而不是你的调用者

我之前说过,立即为单个同步函数调用await 是不好的。但情况并非总是如此,因为您只能在本身异步的函数中使用 await,因此函数的调用方不会被阻止(除非它也调用 wait)。

例如,您可以创建一个简单的函数来获取一些数据,并使用 await AjaxShizzleGoesHere() 包装更复杂的 Ajax 调用。即使您的函数只是调用另一件事并等待它,仍然可以并行运行它。您的函数必须等待 Ajax 调用返回(因此它使用 await,并且被阻塞),但函数的调用者不必立即等待结果,它可以启动首先是其他异步函数。

关于javascript - javascript async wait 对 Web 应用程序有好处吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46589758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com