原文首发地址: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((''));
}, time);
})
};
let arr = [, , , , , , , , , ]
var start = async function(){
arr.forEach(()=>{
console.log( await sleep() )
})
}
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(''));
}, time);
})
};
let arr = [, , , , , , , , , ]
var start = function(){
arr.forEach(async ()=>{
await sleep()
})
}
start();

运行结果:

至此,问题解决。

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

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

先举个例子:

③.小明说:重启试试

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

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

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

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

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

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

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

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

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

④.小红重启了手机

这时候④就是③的下文

需要注意的是,上下文是一个整体,上面我把它分开只是为了理解,实际过程中,不存在单独的上文和下文,所以这是await 必须在async 的上下文 的具体意义。

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

  1. php Yii2 报错unexpected '}'

    报错unexpected '}'一般是缺少":"导致的

  2. 记录微信小程序报错 Unexpected end of JSON input;at pages/flow/checkout page getOrderData function

    微信小程序报错 Unexpected end of JSON input;at pages/flow/checkout page getOrderData function 这个报错是在将数组对象通过 ...

  3. 报错Unexpected token u

    报错Unexpected token u,出错位置提示在index.html的第一行. 出现这个错误的原因是尝试JOSN.parse一个undefined的对象导致的,解决办法就是如果为undefin ...

  4. linux服务器启动报错UNEXPECTED INCONSISTENCY解决方法

    内网的linux服务器给开发员用来测试以及共享文件使用,今天早上发现xshell连接不上该服务器,一开始进入系统显示reboot and select proper boot device or in ...

  5. node模拟后台返回json书写格式报错--Unexpected token ' in JSON at position 1

    最近在学习Node的知识,就尝试写了一个注册登陆的简单功能,但是自己在模拟后台返回值的时候,总是报错Unexpected token ' in JSON at position 1,查找原因之后,是因 ...

  6. webpack打包报错Unexpected token

    最近项目要上线,需要对项目进行打包部署到服务器上面,在打包过程中npm run build后出现以下报错Unexpected token: punc (() [./~/_element-ui@1.4. ...

  7. electron-vue 引入OpenLayer 报错 Unexpected token export

    electron-vue 引入OpenLayer 报错 Unexpected token export 解决办法: 在 .electron-vue/webpack.renderer.config.js ...

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

    问题: 代码在Forefox和IE8下工作正常,但是在IE6下报错: expected identifier, string or number 假如变量options有多个选项,那么我们可以用逗号分 ...

  9. Vue打包报错Unexpected token: punc(()解决方案

    (用vscode)vue项目打包时,报错,报错信息如下: ERROR in static/js/0.564c764efc3ecf31190c.js from UglifyJs Unexpected t ...

随机推荐

  1. MapReduce框架Hadoop应用(一)

    Google对其的定义:MapReduce是一种变成模型,用于大规模数据集(以T为级别的数据)的并行运算.用户定义一个map函数来处理一批Key-Value对以生成另一批中间的Key-Value对,再 ...

  2. CVE-2016-3714 - ImageMagick 命令执行

    ImageMagick是一款使用量很广的图片处理程序,很多厂商都调用了这个程序进行图片处理,包括图片的伸缩.切割.水印.格式转换等等.但近来有研究者发现,当用户传入一个包含『畸形内容』的图片的时候,就 ...

  3. 时间戳,取值问题 and 倒计时的前端处理

    JavaScript 获取当前时间戳: 第一种方法: var timestamp = Date.parse(new Date()); 获取的时间戳是把毫秒改成000显示, 结果:12809773300 ...

  4. (3)markdown软件的使用

    运行Mou.zip解压出来一个软件,它让托到应用程序中,然后打开 另一种软件为gitBook 安装好软件后,使用快捷键F4可以调出所有的应用程序 使用md(markdown简称)有个缺点就是,当内容比 ...

  5. Android 原生 Intent 分享支持的那些事

    版权声明: 本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有. 每周会统一更新到这里,如果喜欢,可关注公众号获取最新文章. 未经允许,不得转载. 一.前言 对于一个 App ...

  6. 如何搭建自己的Maven远程私仓

    1.首先,配置好Maven,jdk等必备环境 2.配置好环境后,下载最新版本的nexus 下载地址:http://www.sonatype.org/nexus/go 3.打开目录nexus-***\b ...

  7. Apache整合Tomcat的相关问题

    一.概述 在开发中遇到一个问题,tomcat 与Apache服务器适配的问题.客户那边是用wampserver这个集成软件,Aapche版本为2.4.9.想要将tomcat上的jsp显示在Apache ...

  8. 集合-TreeSet-Comparable

    Student类:name.age属性 1 package com.bjpowernode.test01_set2_Comparable; /* * T: type */ public class S ...

  9. 从jsp页面到servlet传值的不同方式

    1.利用超链接<a></a>来传递参数 例如: <td><a href="/month811/Servlet?id=${student.id}&am ...

  10. 去除ios反调试

    在逆向过程中经常会遇到反调试,如下段代码: 0008bd8e movs r1, #0xa ; argument #2 for method imp___symbolstub1__dlopen 0008 ...