前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >详解ES7的async及webpack配置async

详解ES7的async及webpack配置async

作者头像
空空云
发布于 2018-09-27 03:49:40
发布于 2018-09-27 03:49:40
2.4K111
代码可运行
举报
文章被收录于专栏:大前端_Web大前端_Web
运行总次数:1
代码可运行

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://cloud.tencent.com/developer/article/1347539

项目中有个需求,类似视频网站下载视频,比如有5个case,每个case有数量不等的的video需要从服务端下载,并且video的下载顺序是串联的,只有当正在下载的case下载完才能下载另外一个case,否则下一个case处于wait状态。

如何解决此问题

  • 使用Promise 利用promise的then方法,但是因为无法确定每个case的video的数量,导致不能确定后面应该接几个then,最开始想到一个笨方法,列一个表格把所有可能的video数量都列出来(因实际需求每个case不会超过10个video),然后去套用不同的方法,
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function downVideoSeries(n) {
  if(n === 1) {
    return new Promise((resolve, reject) =>{
      //ajax code for one video
    }).then((resolve)=>{
      ...
    }).catch((err)=>{
      ...
    })
  }else if(n ===2) {
    return new Promise((resolve, reject) =>{
      //ajax code for one video
    }).then((resolve)=>{
      new Promise((resolve, reject) =>{
        //ajax code for another video
      })
    }).then((resolve)=>{
      ...
    }).catch((err)=>{
      ...
    })
  }
  ...
}

后经重新查看Promise,可以发现能构造一个空的Promise来解决问题,动画一帧帧执行的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function chainAnimationsPromise(elem, animations) {

  // 变量ret用来保存上一个动画的返回值
  let ret = null;

  // 新建一个空的Promise
  let p = Promise.resolve();

  // 使用then方法,添加所有动画
  for(let anim of animations) {
    p = p.then(function(val) {
      ret = val;
      return anim(elem);
    });
  }

  // 返回一个部署了错误捕捉机制的Promise
  return p.catch(function(e) {
    /* 忽略错误,继续执行 */
  }).then(function() {
    return ret;
  });

}
  • 流程控制终极大法: async

async会将其后的函数(函数表达式或lamada)的返回值封装成一个Promise对象,所以获取async返回值用then调用。

async中的await用同步的方式来执行异步流,并且是阻塞的,只有当前的await执行,流程才会走向下一个。很适合此项目需求,因之前未用过,故配置webpack也遇到了坑。类似代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async startDownPerCase() {
try{
     for(let i=0; i<len; i++) {
       let url = 'xhr.url';
       //异步请求
       await self.doBlobGet(url, ...args)
       .then(()=>{
         //成功回调
         ....
       }).catch((err)=>{
         //失败回调
         ...
       });
     }
   } catch(e) {
     console.log(`[downPerCaseError], ${e}`);
   }
}

在react+webpack中使用async

项目架构为webpack+react+es6。未配置的情况下,执行会输出错误提示Babel 6 regeneratorRuntime is not defined,查阅stackoverflow,需要进行配置

  • npm install babel-preset-stage-3 和 npm install babel-polyfill
  • webpack.config.js中entry添加 ‘babel-polyfill’, __dirname + ‘/router.js’
  • bable的presets设置为presets: ['es2015', 'stage-3', 'react']
  • eslint设置为如下,把版本改成8,保证不报error错误
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"parserOptions": {
        "ecmaVersion": 8,
        "sourceType": "module",
        "ecmaFeatures": {
            "jsx": true
        }
    }

还有另外一种解决方案,使用 babel-plugin-transform-runtime

参考 https://stackoverflow.com/questions/33527653/babel-6-regeneratorruntime-is-not-defined

async的用法

async函数返回一个 Promise 对象,可以使用then方法添加回调函数

返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}

asyncPrint('hello world', 50);

await 命令

正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function f() {
  return await 123;
}

f().then(v => console.log(v))
// 123

只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function f() {
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}

所以一般会使用try catch来捕获错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function f() {
  try {
    await new Promise().then(()=>{}).catch(()=>{});
  } catch(e) {
  }
  return await Promise.resolve('hello world');
}

如果有多个await命令,可以统一放在try…catch结构中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
async function main() {
  try {
    const val1 = await firstStep();
    const val2 = await secondStep(val1);
    const val3 = await thirdStep(val1, val2);

    console.log('Final: ', val3);
  }
  catch (err) {
    console.error(err);
  }
}

async语法参考阮一峰大神写的http://es6.ruanyifeng.com/#docs/async#基本用法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年10月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
11 条评论
热度
最新
请问腾讯云的terraform能技术支持一下吗,在使用terraform进行腾讯云资源管理的时候遇到一些问题,Q1242108463
请问腾讯云的terraform能技术支持一下吗,在使用terraform进行腾讯云资源管理的时候遇到一些问题,Q1242108463
回复回复点赞举报
由浅入深,娓娓道来,必须赞!
由浅入深,娓娓道来,必须赞!
回复回复点赞举报
小编写的太详细了!非常棒,良心云!
小编写的太详细了!非常棒,良心云!
回复回复点赞举报
了解了一些Terraform,Terraform是一款基于Golang的开源的资源编排工具,可以让用户管理配置任何基础架构,可以管理公有云和私有云服务的基础架构,也可以管理外部服务。腾讯云的老用户了,尤其喜欢腾讯云的控制台架构
了解了一些Terraform,Terraform是一款基于Golang的开源的资源编排工具,可以让用户管理配置任何基础架构,可以管理公有云和私有云服务的基础架构,也可以管理外部服务。腾讯云的老用户了,尤其喜欢腾讯云的控制台架构
回复回复点赞举报
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户,我个人最喜欢是腾讯云的控制台,简单的又不失美观
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户,我个人最喜欢是腾讯云的控制台,简单的又不失美观
回复回复点赞举报
良心云大法好 期待
良心云大法好 期待
回复回复点赞举报
简洁,直观,强大,无疑是最受喜欢
简洁,直观,强大,无疑是最受喜欢
回复回复点赞举报
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户
一家云服务商有便捷易操作,直观,功能强大的控制台无疑会吸引大量用户
回复回复点赞举报
资源CURD的实现的功能貌似有点单一,一般对资源的管控都有这相对严格的限制条件
资源CURD的实现的功能貌似有点单一,一般对资源的管控都有这相对严格的限制条件
回复回复点赞举报
腾讯、阿里、百度、京东、华为都用过,但是最喜欢的还是腾讯云,莫过于其“控制台”的构架及适用舒适。
腾讯、阿里、百度、京东、华为都用过,但是最喜欢的还是腾讯云,莫过于其“控制台”的构架及适用舒适。
回复回复点赞举报
加载更多
推荐阅读
编辑精选文章
换一批
如何把控制台上已有的资源导入terraform
对于老用户,常常有把控制台上已有的资源导入terraform的需求。本篇以把控制台上已有的eip资源为例,介绍如何导入已有资源到terraform编排中。同时将该资源与tf中创建的NAT网关相绑定。
王罡
2019/11/22
3.8K0
如何把控制台上已有的资源导入terraform
基于腾讯云 DeepSeek 的 AI 智能阅读助手开发实践
在当今信息爆炸的时代,快速而高效地阅读文档和整理信息变得极其重要。专业人士、学生和学术研究者通常需要阅读大量的资料,而这些文档往往篇幅冗长、内容专业,需要耗费大量时间才能完全理解。特别是面对技术文档、学术论文或行业报告时,即使是领域专家也常常需要反复阅读才能掌握核心内容。
陈明勇
2025/03/19
45912
基于腾讯云 DeepSeek 的 AI 智能阅读助手开发实践
通过terraform快速创建腾讯云基础资源
Terraform是一个IT基础架构自动化编排工具,可以用代码来管理维护IT资源。它编写了描述云资源拓扑的配置文件中的基础结构,例如虚拟机、存储账户和网络接口。Terraform的命令行接口(Command Line Interface,CLI)提供一种简单机制,用于将配置文件部署到腾讯云或其他任意支持的云上,并对其进行版本控制。
Vicwan
2020/03/12
8.2K0
Terraform系列二腾讯云CVM进一步相关玩法
紧接Terraform系列一腾讯云CVM相关简单创建。准备围绕着cvm先熟悉一下基本的流程。比如:系统盘扩容,挂载数据盘,帐号密钥ssh-key,绑定公网ip.研究一下官方文档体验一下!
对你无可奈何
2022/03/31
2.5K1
腾讯云Terraform应用指南(一)
《腾讯云Terraform应用指南》系列文章旨在帮助腾讯云用户借助Terraform,轻松使用简单模板语言来定义、预览和部署云基础结构,让用户通过IaC,基于腾讯云的OpenAPI一键创建或销毁多路资源。利用Terraform这把利器,帮助用户节约资源开销,提高从部署到运维的自动化生产力。
生态产品团队
2019/07/26
19.7K5
怎样用terraform管理现存资源
通过阅读前面几篇文章,希望大家了解了基础架构及代码的基本概念,以及如何使用packer和terraform在腾讯云上进行新云资源的高效编排。但是在现实世界里,云管理团队还要管理以前那些没有通过terraform管理的资源,本文会作出一个通用流程,方便大家使用。
刘宇雷
2019/08/21
3.2K0
怎样用terraform管理现存资源
Terraform系列一腾讯云CVM相关简单创建
记得2019左右就看到过Terraform系列的文章和书籍,当时所有的业务都上云了管理也很是方便,看了一眼就没有作过多的研究。但本着对技术发展的前瞻敏锐性, 还是觉得这个东西是会火起来的。正巧最近泽阳大佬devops训练营https://www.yuque.com/devopsvip穿插上了Terraform!个人又开始体验了一把......
对你无可奈何
2022/03/30
4.1K5
Terraform开启本地日志跟踪以及问题自查
|本文以tencentcloud terraform 为例,介绍使用terraform CLI过程中如何开启本地日志跟踪以及一些通用问题的自查方法
Sesede_被告警吵醒
2021/02/26
2K0
Terraform开启本地日志跟踪以及问题自查
如何高效的进行腾讯云上的资源编排,一起来聊一聊Terraform
“腾讯云IaC最佳实践”系列文章希望通过介绍Terraform、Chef和Ansible等生态产品工具及相关案例,使用户能够更好地在腾讯云上实践IaC,为腾讯云用户提供增值服务。本文是“腾讯云IaC最佳实践”系列文章的第1篇。
生态产品团队
2019/07/22
18.6K4
terraform 入门:创建腾讯云 k8s 集群
本文适合不喜欢在浏览器中点点点,并刚刚入门或者想要入门 terraform 的小伙伴。
谢正伟
2021/08/05
4K0
terraform 入门:创建腾讯云 k8s 集群
最佳实践|用腾讯云AI图像能力实现AI作画
最近看到一篇有趣的文章,一副名为《太空歌剧院》(如下图)的艺术品在某美术比赛上,获得了第一名的成绩, 有意思的是这件作品是通过AI来实现的画作, 顿时觉得非常神奇。 结合近期科技媒体频频报道的AI作画爆火现象,深入了解了下,发现市面上有一些AI作画的小程序, 是通过输入一段文字给AI, 然后输出一副和文字意思相近的图片。 这个感觉非常有意思,某种程度上会给绘画行业带来新的发展契机。
腾讯云AI
2022/11/11
4.3K0
最佳实践|用腾讯云AI图像能力实现AI作画
terraform简单的开始-vpc cvm创建
一个 resource 块包含 resource 关键字、资源类型、资源名和资源块体三部分。这是terraform中创建资源常用的格式!
对你无可奈何
2023/09/20
3970
Terraform语法入门
HCL是Terraform的配置语言,它是HashiCorp发明的一种声明式语言,能够以更加简短和人性化的方式来描述资源。本文主要介绍HCL配置语言的基本语法及使用,语法采用当前最新版本0.12。
oliverpei
2020/03/17
8.5K2
AI 最佳实践|用腾讯云智能文本图像增强打造一个掌上扫描仪
在日常生活、工作中, 受限于拍照技术、拍摄条件等制约,得到的文本图像往往存在光照不均、角度倾斜、文字模糊等情况。这种低质量的文本图像不仅不利于保存和后续研究,也不利于光学字符识别。为了解决以上问题,特别调研了业内相关的产品,发现腾讯云AI的文本图像增强能力可以很好的打造一个掌上扫描仪。
腾讯云AI
2023/04/26
1.7K0
AI 最佳实践|用腾讯云智能文本图像增强打造一个掌上扫描仪
初识Terraform Provider 开发框架
Terraform是目前比较火的Ias工具,可以实现多云,多资源的管理。目前其提供的peovider已经是人人都可以写,人人都可以用了。那么作为一个资源提供者,如何让用户便捷使用和管理自己的资源已经是资源提供者首要考虑的问题。那么作为开发者,如何开发一款自己的provider呢?本文以framwork为着手点进行介绍。
金鹏
2024/05/11
3040
Terraform 入门
为了使Terraform能够对你的AWS账户进行直接操作,需要将环境变量AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY
yeedomliu
2021/12/10
2.8K0
Terraform 入门
如何2分钟用terraform创建腾讯云CLB+CVM+Mysql资源?
大家好,随着腾讯云业务资源不断完善,公司业务不断增长,需要使用的资源和运维配置也越来越多,为大大降低资源配置复杂度,以及释放运维人员配置精力,近期发现国际多家云厂商和海外多云资源纳管SaaS平台,开始使用【Terraform】中间件生态产品,这个产品中间件通过创建一个prider虚拟中间层,实现上层业务命令转换到底层云平台的业务指令,阿里云的云架构图设计资源,就是通过Terraform中间件来完成自动业务架构创建使用的。
TCS-F
2024/05/14
2880
如何2分钟用terraform创建腾讯云CLB+CVM+Mysql资源?
windows terraform创建云服务器
terraform跨平台、跟多家公有云都有对接,之前我写过一篇linux平台terraform创建云服务器的文档,这里介绍windows平台terraform创建云服务器。
Windows技术交流
2024/12/20
2320
最佳实践|用腾讯云智能文字识别实现网约车信息管理
据网约车监管信息交互平台统计,截至2022年7月31日,全国共有279家网约车平台公司取得网约车平台经营许可,各地共发放网约车驾驶员证460.0万本、车辆运输证188.2万本,至7月份共收到订单信息6.95亿单。网约车司机的身份、驾驶证、行驶证、车辆信息的收集和管理是一项非常艰巨的任务,安全合规地收集管理网约车的信息可以有效的保障乘客的安全,加强对驾驶员的审核,提升出行的安全。
腾讯云AI
2023/04/17
3.5K0
最佳实践|用腾讯云智能文字识别实现网约车信息管理
Terraform系列三腾讯云CVM中的玩法
紧接:Terraform系列一腾讯云CVM相关简单创建,Terraform系列二腾讯云CVM进一步相关玩法。cvm创建完成,准备初始化一下系统,挂载一下数据盘,在cvm中安装一些软件,做一些简单的配置!
对你无可奈何
2022/04/03
3.8K1
相关推荐
如何把控制台上已有的资源导入terraform
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档