虽然co是社区里面的优秀异步解决方案,但是并不是语言标准,只是一个过渡方案。ES7语言层面提供async / await去解决语言层面的难题。目前async / await 在 IE edge中已经可以直接使用了,但是chrome和Node.js还没有支持。幸运的是,babel已经支持async的transform了,所以我们使用的时候引入babel就行。在开始之前我们需要引入以下的package,preset-stage-3里就有我们需要的async/await的编译文件。

无论是在Browser还是Node.js端都需要安装下面的包。

 npm install babel-core --savenpm install babel-preset-es2015 --savenpm install babel-preset-stage-3 --save

  

这里推荐使用babel官方提供的require hook方法。就是通过require进来后,接下来的文件进行require的时候都会经过Babel的处理。因为我们知道CommonJs是同步的模块依赖,所以也是可行的方法。这个时候,需要编写两个文件,一个是启动的js文件,另外一个是真正执行程序的js文件。

启动文件index.js

require('babel-core/register');
require('./async.js');

  真正执行程序的async.js

const request = require('request');const options = {url: 'https://api.github.com/repos/cpselvis/zhihu-crawler',headers: {'User-Agent': 'request'}
};const getRepoData = () => {return new Promise((resolve, reject) => {request(options, (err, res, body) => {if (err) {reject(err);}resolve(body);});});
};async function asyncFun() {try {const value = await getRepoData();// ... 和上面的yield类似,如果有多个异步流程,可以放在这里,比如// const r1 = await getR1();// const r2 = await getR2();// const r3 = await getR3();// 每个await相当于暂停,执行await之后会等待它后面的函数(不是generator)返回值之后再执行后面其它的await逻辑。return value;} catch (err) {console.log(err);}
}asyncFun().then(x => console.log(`x: ${x}`)).catch(err => console.error(err));

  

注意点:

  • async用来申明里面包裹的内容可以进行同步的方式执行,await则是进行执行顺序控制,每次执行一个await,程序都会暂停等待await返回值,然后再执行之后的await。
  • await后面调用的函数需要返回一个promise,另外这个函数是一个普通的函数即可,而不是generator。
  • await只能用在async函数之中,用在普通函数中会报错。
  • await命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。

其实,async / await的用法和co差不多,await和yield都是表示暂停,外面包裹一层async 或者 co来表示里面的代码可以采用同步的方式进行处理。不过async / await里面的await后面跟着的函数不需要额外处理,co是需要将它写成一个generator的。

promise.then().catch()的catch通过async/await怎么处理???

try {const value = await getRepoData();return value;} catch (err) {console.log(err);}

 牛逼解释: https://segmentfault.com/a/1190000007535316

转载于:https://www.cnblogs.com/smzd/p/8665214.html

async / await对异步的处理相关推荐

  1. Javascript中的async await

    async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度,本篇文章将分享asy ...

  2. 看看async,await 是如何简化异步的调用WCF!

    A:调用WCF难吗? B:不难 A:异步调用WCF难吗? B:不难, A:异步的调用WCF,并且需要保证异步的调用顺序难吗? B:不难 A:那什么难? B:异步的调用WCF,并且保证几个异步的调用顺序 ...

  3. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

  4. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

    Atitit. Async await 优缺点 异步编程的原理and实现 java c# php 1. async & await的来源1 2. 异步编程history1 2.1. 线程池 2 ...

  5. 用 async/await 来处理异步

    引用出处:https://www.cnblogs.com/SamWeb/p/8417940.html 昨天看了一篇vue的教程,作者用async/ await来发送异步请求,从服务端获取数据,代码很简 ...

  6. AsyncLocal 与 async await

    大家来看一张图 先猜猜看为什么会这样 关于async await的原理 建议查看 https://blog.csdn.net/brook_shi/article/details/50803957 这篇 ...

  7. python await原理_JavaScript async/await原理及实例解析

    随着Node 7的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await. 异步编程的最高境界,就是根本不用关心它是不是异步. async 函数就是隧道尽头的亮光,很多人认为它 ...

  8. JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!...

    此篇是 JavaScript是如何工作的第四篇,其它三篇可以看这里: JavaScript是如何工作的:引擎,运行时和调用堆栈的概述! JavaScript是如何工作的:深入V8引擎&编写优化 ...

  9. Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

最新文章

  1. Tcl学习之--列表|字典
  2. matlab支持的文件类型,MATLAB可以读取的数据文件类型有()
  3. 操作系统课设--虚拟内存
  4. 图解WildFly8之Servlet容器Undertow剖析
  5. 【NET CORE微服务一条龙应用】第二章 配置中心使用
  6. 【JAVA基础篇】抽象类和接口的区别
  7. web浏览器_Web上的分享(Share)API
  8. quartz定时任务配置
  9. 详解!智能工厂物流系统规划步骤
  10. python题目-回文数判断
  11. 常用app URL schemes
  12. Java实现满天星动案例
  13. WMLS10自动建立BIN位(模板配置)
  14. 串行口数据缓冲寄存器 SBUF 之 初步了解
  15. docker GitLab-runner CI/CD持续集成
  16. 离线安装python库
  17. CentOS8 安装epel 使用阿里云镜像、更换国内源(阿里源)[转]
  18. 孙多洋《融资智慧》光谷亮剑 瞬间破译融资密码
  19. 分析器错误信息:nbsp;无法识别的配置节…
  20. 以quot;小刀会“的成败论当今创业成败

热门文章

  1. Android中Log信息的输出方法
  2. 嵌入式名词以及简略说明
  3. php websocket 是否在线_看完让你彻底理解WebSocket原理,附实战代码(包含前端和后端)...
  4. java random产生随机数_java的三种随机数生成方式,必掌握
  5. less中的for循环
  6. Linux 防火墙:Netfilter iptables
  7. sourcetree,创建工作流报错:Fatal: Not a gitflow-enabled repo yet. Please run 'git flow init' first.-》解决办法...
  8. docker 操作 记录
  9. hdoj 2022 海选女主角
  10. Discretized Streams: An Efficient and Fault-Tolerant Model for Stream Processing on Large Clusters