为什么我的async异步函数会报'message标识符已声明'的SyntaxError错误
报错触发原因
该报错属于JS解析阶段就会抛出的语法错误,和async异步逻辑无关,触发原因有两点:
- 你在
demoPromise的try同一块级作用域内,使用let关键字重复声明了同名变量message。let、const关键字声明的变量有块级作用域约束,同一作用域内不允许重复声明同一个标识符,直接触发语法报错。 - 代码中
catch ((error) => {的写法不符合语法规范:catch后直接跟参数变量即可,不需要额外套括号写箭头函数格式,这也会导致语法错误。
解决方法
方案1:复用变量,取消重复声明
如果不需要保留第一次await myPromise的结果,直接给已声明的message变量重新赋值即可,同时修正catch的语法:
/* async/await */ async function demoPromise() { try { let message = await myPromise; // 去掉前面的let,直接赋值覆盖原有值 message = await helloPromise(); console.log(message); } catch (error) { // 去掉多余括号,直接写参数名 console.log("Error:" + error.message); } } /* 调用异步函数 */ (async () => { // 注意:如果myDate函数未提前定义,此处会抛出引用错误,需补充对应函数定义 await myDate(); })();
方案2:区分变量命名
如果需要同时保留两次异步调用的结果,给第二个变量设置不同的标识符即可:
/* async/await */ async function demoPromise() { try { let firstMessage = await myPromise; let secondMessage = await helloPromise(); console.log(firstMessage, secondMessage); } catch (error) { console.log("Error:" + error.message); } }
内容的提问来源于stack exchange,提问作者Sal
相关产品推荐
相关产品推荐

