【问题标题】:Best way to use asyn/await in the following code在以下代码中使用 async/await 的最佳方式
【发布时间】:2021-03-19 13:26:10
【问题描述】:

我是 Javascript 的新手,我想连接到数据库并运行一个脚本。然后按顺序获取脚本和运行函数的结果。 如果其中一个功能有任何错误,它应该停止并且不运行其他功能。

我尝试了以下方法:

const {
  Client
} = require('pg')
const client = new Client({
  'connection info'
})

client.connect()
  .then(() => console.log('DB connected'))
  .catch(err => console.error('connection error', err.stack))

let dbResult

const data = async() => {
  try {
    dbResult = await client.query('SCRIPT') // array of json 
  } catch (error) {
    console.log(error);
  }
}

const func1 = async() => {
  try {
    // do something with dbResult
    console.log('func1 success msg')
  } catch (error) {
    console.log('error in func1')
  }
}

const func2 = async() => {
  try {
    // do something with dbResult
    console.log('func2 success msg')
  } catch (error) {
    console.log('error in func2')
  }
}

const func3 = async() => {
    dbResult.forEach(result => {
    // do something
})
  try {
    // do something with dbResult
    console.log('func3 success msg')
  } catch (error) {
    console.log('error in func3')
  }
}

data()
func1()
func2()
func3()

【问题讨论】:

  • 此代码是否按原样工作?还是您发现任何错误?

标签: javascript node.js async-await callback


【解决方案1】:

你调用的所有函数都是async,因此返回 Promises 并且应该等待。您可以在 try/catch 块中等待所有这些,因此如果一个失败,其他将不会执行。

不要在每个单独的函数中使用 try/catch,而是在这里:

const data = async() => client.query('SCRIPT') // array of json 

const func1 = async() => console.log('func1 success msg')

const func2 = async() => console.log('func2 success msg')

const func3 = async() =>  dbResult.forEach(result => console.log(result))

(async () => {
    try{
        await client.connect();
        let dbResult = await data();
        dbResult = await func1(dbResult);
        await func2();
        await func3(dbResult);
    } catch(err) {
      console.log(err);
    }
})();

await Promise.all([data, func1, func2, func3]) 如果其中一个 Promise 失败,也会失败,但不保证执行顺序。

【讨论】:

  • 我能得到每个函数的错误吗?假设函数 1 有错误。我认为 try/catch 在我看来会更好。你能给我一个不使用它的理由吗?
  • 但我确实使用了 try/catch。如果任何函数抛出错误,它将被捕获在catch(err) 中。
  • 是的,这是一个好方法。但是如何获取第一个函数 data() 的结果并将其结果用于其他函数呢?
  • 我不明白 (async () => {})() 函数 :) 我第一次看到。所以这就像它在某个地方被调用一样工作?为什么你在每个函数中都给出参数?
  • 啊,这是一个自动执行的匿名函数。 await 必须在 async 函数内使用(除了在最新版本的 Node 中,await 可以直接在顶层使用(“顶层等待”)
【解决方案2】:

下面是如果你必须在你的每个函数体内使用 try catch。如果不是,那么我会坚持上面 Jeremy 的回答。

您可以做的不是控制台记录您在 try..catch 块中收到的错误,而是 throw new error,这将停止执行您的代码并控制台记录实际错误。 (嗯,不完全是控制台日志,而是 console.error() 它)

这将阻止其他功能的执行,除非您对错误进行了处理(根据错误进行一些错误处理,您可以在其中执行其他代码)。

一般来说,这个的语法如下:

try {
  await someStuff();
} catch (err) {
  throw new Error(err)
}

对象err 具有一些附加属性,例如namemessage。 这里有更多关于 Error 对象的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2022-06-11
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多