async-await - Async/Await 模拟繁忙的服务器,延迟更新到客户端浏览器
问题描述
MERN 菜鸟在这里。尝试通过模拟繁忙的服务器来学习异步/等待,其中客户端浏览器仅在 3 秒后才获得更新(我将在 3 秒后手动刷新 localhost:3000。我只需要 Node.js/ 服务器端的帮助来解决这个问题)
你能帮忙纠正下面的代码吗?请避免提出其他方式/方法,但请向我展示如何使用以下示例实现。提前致谢。
const app = require('express')()
async function getData() {
//Purpose: to simulate a busy server that returns data back to browser, after 3 seconds delay
await setTimeout(() => {
return 'After waiting 3 seconds, return this sentense as the required data to the browser.'
}, 3000);
}
app.get('/', async (req, res) => {
try {
const data = await getData()
await res.status(200).send(`${data}`)
} catch (err) {
await res.status(400).send(`Unable to get data. Error message, "${err}"`)
}
})
app.listen(3000)
解决方案
这里的问题是它setTimeout
不返回一个承诺,所以你不能使用await
它。它只是在 3 秒后执行给定的函数。你可以通过像这样将它包装在 Promise 中来得到你想要的:
const app = require('express')()
function getData() {
//Purpose: to simulate a busy server that returns data back to browser, after 3 seconds delay
return new Promise((resolve) => {
setTimeout(() => {
resolve('After waiting 3 seconds, return this sentense as the required data to the browser.');
}, 3000);
});
}
app.get('/', async (req, res) => {
try {
const data = await getData()
await res.status(200).send(`${data}`)
} catch (err) {
await res.status(400).send(`Unable to get data. Error message, "${err}"`)
}
})
app.listen(3008)
请注意,您需要一个return
语句来返回getData
. 您最初没有 return 语句,这意味着函数返回undefined
(或者如果标记为async
它给出了一个解析为的 Promise undefined
)。
这里我们不需要使用 async/await 因为你不需要await
在app.get
. 可以添加使用 async/await ,getData
但这将是多余的。
意识到aync
/await
使用 Promises - 这只是使用 Promises 的一种简单方法。因此,除了Promise
. 请注意,这async
实际上只是意味着“此函数返回 a ,如果它还不是a Promise
,我们会将任何结果包装在a 中”。所以你不能在某些时候使用/而没有 a 。Promise
Promise
async
await
Promise
但是如果你真的想使用async
/await
出于某种原因也许这个例子会帮助你:
async function getData() {
//Purpose: to simulate a busy server that returns data back to browser, after 3 seconds delay
const result = await new Promise((resolve) => {
setTimeout(() => {
resolve('After waiting 3 seconds, return this sentense as the required data to the browser.');
}, 3000);
});
console.log('We are done waiting 3 seconds');
return result; // <-- this returns a Promise that resolves to the result string
}
推荐阅读
- java - JAXB - 嵌套自定义对象编组和解组
- opengl-es - GLSL:片段着色器何时退出/返回
- android - 将 BindView 与 Butterknife 一起使用的反面是什么?
- scala - Spark结构化流内存绑定
- .net - 主机应用程序可以与正在执行的工作流进行通信吗?
- c - 计算C中一串数字中出现频率最高的数字
- ios - 当前位置不显示
- c# - 动态对象引用 C#
- javascript - What the ratio is between 1 unit in Three.js and 1 unit in Oimo.js?
- excel - VBA 取消选择所有切片器选项(1 除外)