【问题标题】:NodeJs - Writing async and non-async functions togetherNodeJs - 一起编写异步和非异步函数
【发布时间】:2020-09-07 07:24:05
【问题描述】:

这是我的模块,x 返回为undefined

const si = require('systeminformation');

async function systemData() {
  try {
    let data = await si.system()
    return {
      manufacturer: data.manufacturer,
      model: data.model
    }
  } catch (err) {
    console.log(`${err}`)
  }
}

function checkSystemData() {
  (async () => {
    let sd = await systemData()
    if (sd.manufacturer === 'X') { // Many more such checks

    } else {
      return { check: false, manufacturer: sd.manufacturer }
    }
  })()
}

let x = checkSystemData()
console.log(x)

checkSystemData() 的作者不能将其设为async,因为它是更大模块的一部分。我如何重构它以接收x{ check: false, manufacturer: sd.manufacturer }

【问题讨论】:

  • 这根本不可能。您无法立即获得异步任务的结果。
  • 如果您需要checkSystemData 同步返回结果,则需要找到si.system() 的同步版本。但实际上,您应该让它异步,并让函数的用户处理它。
  • @Bergi 这是一个已有的项目,有一些“历史”。所以,后果是相当高的,我希望尽量减少“爆炸半径”。 :)
  • 正如 Bergi 所说,根本不可能。异步派生的数据不能同步返回。引入中间函数并不能解决问题。

标签: node.js function promise async-await undefined


【解决方案1】:

你需要从 checkSystemData() 中返回一些东西

return (async () => { // add return
  let sd = await systemData()
  if (sd.manufacturer === 'X') { // Many more such checks

  } else {
    return { check: false, manufacturer: sd.manufacturer }
  }
})()

那么你可以使用

checkSystemData().then(response => {
  console.log(response)
})

let x = await checkSystemData()

【讨论】:

  • 是否无法从checkSystemData() 获得已解析的输出 - 这样我就不必.thenawait
  • 不,它返回一个 Promise,这意味着该值将在稍后可用。 .then 等待这个结果并调用函数,而await 停止函数并返回值,但仅在异步函数中可用。您无法从异步函数中获得同步答案。
猜你喜欢
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
相关资源
最近更新 更多