我在nodejs 8(没有babel)上测试了这段代码。巴贝尔,两者都表现出相同的效果。
async function refreshBalance({ user }) {
console.log(user) // show correct variable
try {
console.log(user) // throw error: variable not defined
const user = await findObject('_User', user.id, {
sessionToken: user.getSessionToken(),
})
return {
balance: user.get('balance'),
balanceUpdatedAt: user.get('updatedAt'),
}
}
catch (error) {
return formattedError(error)
}
}
但如果我删除await
,则不会抛出错误:
async function refreshBalance({ user }) {
console.log(user) // show correct variable
try {
console.log(user) // show correct variable, no error
return true
}
catch (error) {
return formattedError(error)
}
}
我知道我可以像这样缓存变量以使其工作:
async function refreshBalance({ user }) {
const theUser = user
try {
console.log(theUser) // `theUser` variable is safe, `user` variable will throw error
const user = await findObject('_User', theUser.id, {
sessionToken: user.getSessionToken(),
})
return {
balance: theUser.get('balance'),
balanceUpdatedAt: theUser.get('updatedAt'),
}
}
catch (error) {
return formattedError(error)
}
}
我很好奇为什么第一种方法显示错误?我已经搜索过google&没有找到任何答案。
修改
如果user
是一个对象,则会抛出错误,如果user
是字符串或数字,则不会抛出错误。
以下是我执行该功能的方法:
refreshBalance({ user: { id: '123 '} })
答案 0 :(得分:3)
将我的评论写成答案,因为它似乎适合你。
您对const user = ...
的定义是"隐藏"或者"覆盖"同名的函数参数使得函数参数在定义const user
的范围内无法访问。
最简单的解决方案是将这两个变量之一的名称更改为其他变量,以免它们发生冲突。