从async await 报错Unexpected identifier 谈谈对上下文的理解

原文首发地址:http://www.cnblogs.com/lonhon/p/7518231.html

先简单介绍下async await:

  async/await是ES6推出的异步处理方案,目的也很明确:更好的实现异步编程。   详细见阮大神 ES6入门

现在说说实践中遇到的问题:使用await报错Unexpected identifier

先上代码:

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve((‘999‘));
        }, time);
    })
};
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var start = async function(){
    arr.forEach(()=>{
        console.log( await sleep(2000) )
    })
}
start();

在循环中使用sleep方法,这时候报错:Unexpected identifier

原因:通过查资料发现一句话 await必须在async函数的上下文中。(后面重点讲)通过个人理解的这句话就是await只能在async函数中使用。

以上面的代码为例子,虽然最外层start函数是通过async声明的,在start函数体内部的箭头函数中使用了await,而该箭头函数是一个普通函数,所以await的上文是一个普通函数,最终导致报错。

解决办法,将箭头函数声明为async函数,代码如下:

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            resolve(console.log(‘999‘));
        }, time);
    })
};
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
var start = function(){
    arr.forEach(async ()=>{
        await sleep(2000)
    })
}
start();

运行结果:

至此,问题解决。

await必须在async函数的上下文中。出处

上下文,英文context,其完整意思应当是concatenate-text,联系文本,编程中翻译为“引用池”或者“引用区”更加恰当

先举个例子:

③.小明说:重启试试

单从这句话我们不能知道重启什么、为什么小明要说这句话(可能你觉得是电脑)、对谁说的这句话

②.小红说对小明说她微信出来不了输入法

这就是小明为什么说这句话的上文(背景),这时候才能知道小明说的重启是微信程序or手机(真不是电脑)

①.小红和小明躺在床上玩手机

这句也是背景,但是却不能成为3的上文,因为“躺床上”并不是“重启试试”的原因(或者说背景)

函数调用会在内存形成一个"调用记录",又称"调用帧"(call frame),保存调用位置和内部变量等信息

个人理解:上文指出了环境、背景。

拿本文中的第一段错误代码来说,await的上文是一个普通箭头函数,所以使用await会报错,因为编译器在执行到await时,当前调用帧是箭头函数而不是外层的start,所以此时的await就像:小明和小红躺在床上 小明说“重启试试”  ,是无意义(Unexpected identifier)的。

这时候谈谈下文,接上面的例子

④.小红重启了手机

这时候④就是③的下文

这时候await

时间: 2024-10-11 13:47:08

从async await 报错Unexpected identifier 谈谈对上下文的理解的相关文章

JavaScript在IE6,IE7下报错'expected identifier, string or number'

问题: 代码在Forefox和IE8下工作正常,但是在IE6下报错: expected identifier, string or number 假如变量options有多个选项,那么我们可以用逗号分开:但是最后一个选项后不可以有逗号.虽然IE8和Firefox可以忽略这个逗号,但是IE6下会报错(据说IE7下也会报错) 解决方案: 解决方法很简单,把多余的逗号删除就可以了. var options = { target: '.content' //注重不可以加逗号 }; JavaScript在

webpack打包报错Unexpected token

最近项目要上线,需要对项目进行打包部署到服务器上面,在打包过程中npm run build后出现以下报错Unexpected token: punc (() [./~/[email protected]@element-ui/packages/col/src/col.js:23,0][static/js/0.3fbe30ed5a683f62d6bc.js:13890,10] 字面意思是报错来自UglifyJs,在col.js下23行出现了不期望的'(',打开col.js文件查看 不能识别这个函数

create-react-app 报错 Unexpected end of JSON input while parsing near '

按照官方文档安装create-react-app后,执行npx create-react-app后报错: Unexpected end of JSON input while parsing near ...... 执行下面命令可解决 npm cache clean --force , :执行后可以用以下命令检查 npm cache verify 如果还是不行,查看一下npm版本,不是最新的更新一下: npm i -g npm 再有就是试一下换npm的镜像服务器 npm config set r

Linux 启动报错 unexpected inconsistency;RUN fsck MANUALLY

意外停电一次,CentOS启动时报如下错误: unexpected inconsistency;RUN fsck MANUALLY An error occurred during the filesystem check Propping you to shell the system will reboot when you leave the shell Give root password for mantennance 解决方法如下: 1.按提示,输入root用户的密码,进入命令行界面

LInux断电后无法进入系统报错unexpected inconsistency run fsck manully

机房突然断电,万恶啊 机器开启时,出现报错,无法进入系统 输入root  的密码 然后输入命令: fsck -y /dev/mapper/vg_db2-lv_root   注意  -y 后面有空格 结束后 reboot 重新启动

uiautomatorviewer连接机器点击报错Unexpected error while obtaining UI hierarchy

方法一: 参考:https://www.cnblogs.com/lucky0425/p/10955252.html 运行开安卓自带的uiautomatorviewer.bat,打开后连接手机,报错如下: 纠结了很长时间最终用一位大神的方法得到解决,虽然不太懂原理但是已解决了我的问题,原理以后慢慢研究 1.在E盘根目录下创建app.png文本文件 2.在E盘根目录下创建app.uix文本文件 3.执行以下adb命名: adb shell uiautomator dump /sdcard/app.u

内网服务器启动报错UNEXPECTED INCONSISTENCY解决方法

一开始进入系统显示reboot and select proper boot device or insert boot media in selected boot device and press a key,然后进入bios查看boot的启动选,查看并没有磁盘,再看bios显示的时间是昨晚凌晨3点的时间,时间不准确一般是主板的电池没电了,我设置了每周日凌晨两点重启电脑,因为主板电池没电导致系统启动异常的原因,我更换了主板的电池然后在bios设置了准确的时间并设置磁盘为第一启动盘,进入系统出

npm 在安装 Vue脚手架命令(npm install -g @vue/cli)时报错安装报错--“Unexpected end of JSON input while parsing near···”

在安装Vue的脚手架(npm install -g @vue/cli 项目名称)时,提示: Unexpected end of JSON input while parsing near 其实,但凡使用npm 时,只要提示这个,都可以按照以下几种方式进行尝试. 第一种:删掉package.lock.json 第二种:清除cache npm cache clean --force第三种:进入下面这个文件夹,把文件夹npm-cache下的内容删除掉(清除cache) 路径:C:/Users/DELL

JS 调试中常见的报错的解决办法

报错:Uncaught SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse (<anonymous>) at Function.m.parseJSON (jquery.js:8515) at Object.success (crud.html:45) at j (jquery.js:3143) at Object.fireWith [as resolveWith] (jquery.js:3255) at x (