javascript - 如何正确使用嵌套异步代码?

标签 javascript node.js asynchronous vercel-micro

我使用 micro 创建了一个小 api。

运行localhost:3000/get-status应该返回数据对象。 到目前为止,console.log() 正在打印预期的对象。

但是在浏览器上我收到未找到端点,在服务器上我收到错误Si7021重置失败:错误[ERR_HTTP_HEADERS_SENT]:在将 header 发送到客户端后无法设置 header

我的 getStatus() 函数做错了什么?我想我把一些东西与 promise 和异步的东西混淆了。也许我不必要地嵌套了这些函数......

const { send } = require('micro')
const { router, get } = require('microrouter')
const Si7021 = require('si7021-sensor')

const getStatus = async (req, res) => {
  const si7021 = new Si7021({ i2cBusNo: 1 })
  const readSensorData = async () => {
    const data = await si7021.readSensorData()
    console.log(data)
    send(res, 201, { data })
  }

  si7021.reset()
    .then((result) => readSensorData())
    .catch((err) => console.error(`Si7021 reset failed: ${err} `))
}

const notFound = (req, res) => {
  console.log('NOT FOUND.')
  send(res, 404, 'Endpoint not found')
}

module.exports = router(
  get('/get-status', getStatus),
  get('/*', notFound)
)

最佳答案

看起来你的处理程序返回了一个立即解决的 promise 。你能尝试像这样重写最后一行吗?

return si7021.reset()
    .then((result) => readSensorData())
    .catch((err) => console.error(`Si7021 reset failed: ${err}`));

它可以更清晰地写为:

const getStatus = async (req, res) => {
  try {
    const si7021 = new Si7021({ i2cBusNo: 1 });
    await si7021.reset();
    const data = await si7021.readSensorData();
    console.log(data);
    return send(res, 201, { data });
  } catch (e) {
    console.error(`Si7021 reset failed: ${err}`)
  }
}

但是您可能还想在 catch 处理程序中发送一些内容。

另外,请注意, promise 返回自

si7021.reset()
    .then((result) => readSensorData());

不仅仅在 .reset 失败时拒绝。它还会拒绝 readSensorData 失败。所以你的错误消息不完整。总而言之,我宁愿推荐以下内容:

const getStatus = async (req, res) => {
  try {
    const si7021 = new Si7021({ i2cBusNo: 1 });
    await si7021.reset();
    const data = await si7021.readSensorData();
    console.log(data);
    send(res, 201, { data });
  } catch (e) {
    console.error(`Si7021 failed: ${err.message}`);
    send(res, 500, err.message);
  }
}

关于javascript - 如何正确使用嵌套异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52699390/

相关文章:

javascript - 好的服务器 javascript 主机/框架?

javascript - jQuery 选择器无法在 DOM 中找到添加的元素

node.js - 通过 Node 浏览器到 S3 文件传输

node.js - 从另一个 lambda 异步调用 aws lambda

在 Shiny 的应用程序中异步渲染绘图

javascript - Promise.all 和嵌套异步等待哪个更好?

javascript - RequireJS 和依赖于以特定顺序加载的脚本

javascript - History.length 类方法有什么作用?

javascript - Google Cloud Function 未定义参数检测为 null

javascript - 为什么我不能在 Node.js shell 中要求模块?