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

详解ES7的async及webpack配置async

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

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
怎么解决koa写server发布的噩梦
前言 . 以前在用koa写server的时候,发布简直是噩梦。需要将src里面的全部文件都覆盖掉,config配置文件也要覆盖,稍有不慎就会线上报各种各样的问题,然后就得回退,本地调好在发布。偶然看见一篇文章讲如何使用webpack打包koa app,惊为天人,原来webpack也能打包后台。这在以前想都没想过。 关键问题 一:所有node_modules里的模块都不进行打包 webpack的核心功能是将引用的各个模块打到一个文件里,并会将各种规范的模块进行统一的模块化处理(webpack规范)。 然而
企鹅号小编
2018/02/02
2.2K0
怎么解决koa写server发布的噩梦
「Async/Await」仅仅了解使用?这次我们来聊聊它是如何被实现的
这篇 Async 是如何被实现的,其实断断续续已经在草稿箱里躺了很久了。终于在一个夜黑风高的周六晚上可以给他画上一个句号。
19组清风
2022/02/28
8160
「Async/Await」仅仅了解使用?这次我们来聊聊它是如何被实现的
《深入浅出Node.js》:Node异步编程解决方案 之 async函数
关于async函数,需要明确它是generator函数的语法糖,即将生成器函数的*换成async关键字,将yield关键字换成await关键字。使用async函数相比于生成器函数的改进主要在于前者具备内置执行器,即直接调用async函数就能执行完整个函数,就像普通函数调用那样,而无需像生成器函数通过调用返回的迭代器的next()方法来手动执行后续代码,非常方便。此外语义化更友好,并且async函数返回的还是一个Promise对象,可以使用then()方法来指定下一步操作。
前端_AWhile
2019/08/29
1K0
ES6异步处理解决方案
通常把从未决推向已决的resolved状态的过程叫做resolve,从未决推向已决的rejected状态的过程,叫做reject
javascript艺术
2021/05/28
8030
ES6异步处理解决方案
手写async await的最简实现(20行)
如果让你手写async函数的实现,你是不是会觉得很复杂?这篇文章带你用20行搞定它的核心。
ssh_晨曦时梦见兮
2020/04/11
1.5K0
面试官: 说说你对async的理解
async是generator和promise的语法糖,利用迭代器的状态机和promise来进行自更新!
用户8200753
2023/10/22
2170
JavaScript 异步解决方案 async/await
异步操作一直都是 JavaScript 中一个比较麻烦的事情,从最早的 callback hell,到TJ大神的 co,再到 Promise 对象,然后ES6中的 Generator 函数,每次都有所改进,但都不是那么彻底,而且理解起来总是很复杂。
李振
2021/11/26
4070
如何写出一个惊艳面试官的 Promise【近 1W字】 前言源码1.Promise2.Generator3.async 和 await4.Pro
1.高级 WEB 面试会让你手写一个Promise,Generator 的 PolyFill(一段代码); 2.在写之前我们简单回顾下他们的作用; 3.手写模块见PolyFill.
火狼1
2020/05/09
7160
如何写出一个惊艳面试官的 Promise【近 1W字】
                            前言源码1.Promise2.Generator3.async 和 await4.Pro
async的基本用法「建议收藏」
1. 没有显式return,相当于return Promise.resolve(undefined); 2. return非Promise的数据data,相当于return Promise.resolve(data); 3. return Promise, 会得到Promise对象本身
全栈程序员站长
2022/09/07
1.3K0
async 函数的含义和用法
本文是《深入掌握 ECMAScript 6 异步编程》系列文章的最后一篇。 Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义与用法 async函数的含义与用法 一、终极
ruanyf
2018/04/12
6760
async 函数的含义和用法
Promise/async/Generator实现原理解析
笔者刚接触async/await时,就被其暂停执行的特性吸引了,心想在没有原生API支持的情况下,await居然能挂起当前方法,实现暂停执行,我感到十分好奇。好奇心驱使我一层一层剥开有关JS异步编程的一切。阅读完本文,读者应该能够了解:
Nealyang
2020/03/25
1.9K0
异步多图加载这件小事儿(Promise与async)
日常开发过程中,时不时会遇到要同时预加载几张图片,并且等都加载完再干活的情况,结合 Promise 和 async/await 代码会优雅很多,但也容易遇到坑,今天就来简单聊聊。 ES5 先从最基本的 ES5 说起,基本思路就是做一个计数器,每次 image 触发 onload 就加一,达到次数后触发回调函数。 var count = 0, imgs = []; function loadImgs(imgList, cb) { imgList.forEach(function(url,
Bob.Chen
2018/05/02
2.4K0
异步多图加载这件小事儿(Promise与async)
每天3分钟,重学ES6-ES12(十四)async\u002Fawait
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
虎妞先生
2022/09/19
1770
React项目配置7(ES7的Async/Await的使用)
本教程总共6篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React项目配置1(如何管理项目公共js方法)---2018.01.11 2、React项目配置2(自己封装Ajax)---2018.01.12 3、React项目配置3(如何管理项目API接口)---2018.01.15 4、React项目配置4(如何在开发时跨域获取api请求)---2018.01.16 5、React项目配置5(引入MockJs,实现假接口开发)---2018.01.17 6、R
前端人人
2018/04/11
1.4K0
React项目配置7(ES7的Async/Await的使用)
es6异步方法在项目中的实践
如下面的代码所示,执行Success代码条件有两处,在上面的写法里,这两处分开书写,代码没有复用 利用promise的resolve就可以复用了,如第二个例子所示
用户2845596
2021/01/21
3910
async/await 源码实现
如果你有一个这样的场景,b依赖于a,c依赖于b,那么我们只能通过promise then的方式实现。这样的的可读性就会变得很差,而且不利于流程控制,比如我想在某个条件下只走到 b 就不往下执行 c 了,这种时候就变得不是很好控制!
用户4131414
2020/03/19
1.3K0
JS中的 async 和 await 使用技巧
async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果。 await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,它们会被自动转成立即 resolved 的 Promise 对象)。
青梅煮码
2023/02/18
1.8K0
每日两题 T7
•1 <= deck.length <= 10000•0 <= deck[i] < 10000
合一大师
2020/07/17
3840
JavaScript 中如何进行异步编程
JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。
江米小枣
2020/06/16
8070
JavaScript 中如何进行异步编程
async/await 一种非常丝滑的异步语法
---- async是es7提出的一种新的异步语法. 一开始es为了解决异步,使用的是promise, 但看到满屏的then之后,就感觉自己傻逼了. 后来提出了generator, 在底层实现了一个异步的模式, 但需要手动执行. 关于如何使用generator,可以参考,how to use generator. 本文这里,不探讨怎么使用generato. 而是,如果使用generator和promise 构造出async的表达. 文末后面会介绍如何正式的使用 async/await,以及里面有什么需要注意
villainhr
2018/07/03
6570
相关推荐
怎么解决koa写server发布的噩梦
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验