首页 > 解决方案 > 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)

标签: async-await

解决方案


这里的问题是它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 因为你不需要awaitapp.get. 可以添加使用 async/await ,getData但这将是多余的。

意识到aync/await使用 Promises - 这只是使用 Promises 的一种简单方法。因此,除了Promise. 请注意,这async实际上只是意味着“此函数返回 a ,如果它还不是a Promise,我们会将任何结果包装在a 中”。所以你不能在某些时候使用/而没有 a 。PromisePromiseasyncawaitPromise

但是如果你真的想使用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
}

推荐阅读