gpt4 book ai didi

javascript - 使用 await 在 try/catch block 中声明一个 const

转载 作者:搜寻专家 更新时间:2023-10-31 23:03:10 24 4
gpt4 key购买 nike

所以我现在有这个:

var item_id
try {
item_id =
await
(async function () {
// code
})();
} catch (error) {

}

但我更喜欢将 item_id 作为常量。鉴于该 Node 需要我处理 promise 拒绝,将 await 值分配给 const 的最佳方法是什么

例如错误:

[0] (node:77118) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: details[Symbol.iterator] is not a function
[0] (node:77118) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

异步代码

await
(async function () {
const query = `
INSERT INTO item (list_id)
SELECT
?
FROM
list
WHERE
id = ?
AND
user_id = ?
LIMIT 1;
`

const results =
await
doQuery({
inputs: [
list_id,
list_id,
req.session.user.id
// 10
],
query,
error_message: "item create mysql error"
})
return results.insertId === 0 ? false : results.insertId
})();

查询

function doQuery({ query, inputs, error_message, res = null }) {
return (
new Promise(function (resolve, reject) {
db.query(query, inputs, function (err, results, fields) {
if (err) {
console.trace(chalk.green(db.sql))
console.log()
handleError({ error: err, error_message, res })
reject(err)
return
}

resolve(results)
})
})
)
}

处理错误

function handleError({ error, message, res }) {
console.trace(chalk.yellow(message))
console.trace(chalk.red(error))
console.log()

if (res) {
res.send({
error: true,
success: false,
})
}
}

最佳答案

这是一个已在别处讨论过的众所周知的问题。

您的选择包括:

  1. 只需在外层使用 let 声明 item_id,就像您所做的那样。这没有错。

  2. 根据您要对 item_id 执行的操作,在 try/catch block 内执行此操作,允许您声明 const item_id;try 中。

  3. 确保您确实需要一个try/catch。请记住,在 async 函数中抛出的任何错误都将自动转化为对该函数返回的 promise 的拒绝。您不必(在某些情况下也不想)捕获它;相反,在更高级别处理错误。 Node “要求你处理 promise 拒绝”并不意味着你必须在它发生的地方处理它;您可以在任何更高级别处理它。请记住,catch'ing 此处的错误会将异步函数放回“快乐路径”(除非您重新抛出)并且调用函数将无法知道有错误。

  4. 在某些情况下,如果您返回使用 promises 和 .catch(),您的代码将更具可读性,如

    const item_id_promise = async function () {}();

    item_id_promise.catch(...);

    或者甚至可能只是

    return (async function() { }()).catch(...)

但实际上您的问题与awaitasync 或promises 无关。它只是关于 block 内变量的 block 作用域,在本例中是 try block 。是的,constlet 是 block 作用域的,因此作用于 try 子句。所以就像其他任何东西一样,如果你想在 try block 之外使用它们,你必须在 try block 之外声明它们。或者,如果你真的不想在 try block 之外声明它们,你不能在 try block 之外使用它们,所以你必须安排使用它们如果可能的话,只在里面。

关于javascript - 使用 await 在 try/catch block 中声明一个 const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50521153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com