JS异步操作新体验之 async函数
const fs = require('fs')
function readFile(fileName) {
return new Promise((resolve, reject) => {
fs.readFile(fileName, (err, data) => {
if(err) {
reject(err)
}
resolve(data.toString())
})
})
}
readFile('data/a.txt').then(res => console.log(res))
.catch(err => console.log(err))
readFile('data/b.txt').then(res => console.log(res))
.catch(err => console.log(err))
readFile('data/c.txt').then(res => console.log(res))
.catch(err => console.log(err))
function* gen() {
yield readFile('data/a.txt')
yield readFile('data/b.txt')
yield readFile('data/c.txt')
}
let it = gen()
it.next().value.then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
it.next().value.then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
it.next().value.then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
async function read() {
let readA = await readFile('data/a.txt')
let readB = await readFile('data/b.txt')
let readC = await readFile('data/c.txt')
console.log(readA)
console.log(readB)
console.log(readC)
}
read()
最终的输出结果

// 函数声明
async function foo() {
// ....
} // 函数表达式
let foo = async function() {
// ....
} // 箭头函数
let foo = async() => {} // 对象的方法
let obj = {
name: 'Roger',
async foo() { }
}
obj.foo().then(res => {
// ....
}) // 类的方法
class Student{
constructor(name, age) {
this.name = name
this.age = age
}
async say() {
return `My name is ${this.name}, I'm ${this.age} years old !`
}
} let jim = new Student('Jim Green', 13)
jim.say().then(res => console.log(res)) // My name is Jim Green, I'm 13 years old !
// 休眠 ms 毫秒
function sleep(ms) {
return new Promise(resolve => {
setTimeout(resolve, ms)
})
} async function print(ms) {
console.log('start... ...')
await sleep(ms)
console.log('end... ...')
} print(1000)

async function foo() {
return 'hello world'
}
foo().then(res => console.log(res)) // hello world
async function bar() {
return new Error('Error... ...')
}
bar().then(res => console.log(res))
.catch(err => console.log(err)) // Error: Error... ...
async function baz() {
await new Promise(resolve => {
console.log('执行第一个异步操作')
setTimeout(resolve, 2000)
})
await new Promise(resolve => {
console.log('执行第二个异步操作')
setTimeout(resolve, 3000)
})
return '异步执行完毕再执行then方法'
}
baz().then(res => {console.log(res)})

[return_value] = await expression 表达式:一个 Promise对象或者任何要等待的值 返回值:返回 Promise对象的处理结果。如果等待的不是 Promise对象,则返回该值本身
// 如果 await 命令后的表达式的值不是一个 Promise,则返回该值本身
async function foo() {
return await 123
} foo().then(res => console.log(res)) // // 如果 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的返回值
async function bar() {
let f = await new Promise((resolve, reject) => {
resolve('我是表达式的返回值')
})
console.log(f) // 我是表达式的返回值 return 'ending'
} bar().then(res => {console.log(res)}) // ending // 如果 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出
async function baz() {
await new Promise((resolve, reject) => {
reject(new Error('出错啦......'))
})
} baz().then(res => console.log(res))
.catch(err => console.log(err)) // Error: 出错啦......
async function foo() {
await Promise.reject('error')
return 'ending' // 未执行
}
foo().then(res => console.log(res))
// Uncaught (in promise) error
async function foo() {
try{
await Promise.reject('error')
} catch(e) {
}
return await Promise.resolve('执行完毕')
}
foo().then(res => console.log(res)) // 执行完毕
async function foo() {
await Promise.reject('error').catch(err => console.log(err))
return '执行完毕'
}
foo().then(res => console.log(res)) // 执行完毕
// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]); // 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
JS异步操作新体验之 async函数的更多相关文章
- ES6的新特性(18)——async 函数
async 函数 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖. 前文有一个 Generato ...
- async 函数-----------------解决异步操作隧道的亮光
之前也学过,只是没有学好,公司现在用的都是async函数 , 所以决定把它弄懂.最近看了看阮一峰的博客,做下记录. 异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用 ...
- js异步回调Async/Await与Promise区别 新学习使用Async/Await
Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...
- node js 异步运行流程控制模块Async介绍
1.Async介绍 sync是一个流程控制工具包.提供了直接而强大的异步功能.基于Javascript为Node.js设计,同一时候也能够直接在浏览器中使用. Async提供了大约20个函数,包含经常 ...
- 初识async函数
为什么会出现async函数 首先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator 函数的语法糖,这个 ...
- 深入浅出ES6教程『async函数』
大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了Symbol & generator的用法,下面我们一起来继续学习async函数: async [ə'zɪŋk]:这个 ...
- 前端知识点回顾之重点篇——ES6的async函数和module
async函数 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是 Generator 函数的语法糖 什么是语法糖? 意指那些没有给计算机语言添加新功能,而只是 ...
- es6学习笔记-async函数
1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...
- 17.async 函数
async 函数 async 函数 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖. 前文有一个 ...
随机推荐
- 分布式任务调度平台XXL-JOB
<分布式任务调度平台XXL-JOB> 一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...
- mysql安装与配置(以mysql-5.7.10-winx64为例)
一.在官网上下载相应的mysql安装包,本人下载的是:mysql-5.7.10-winx64 (Windows (x86, 64-bit), ZIP Archive) 附下载地址:http://dev ...
- jvm GC
JavaGC.新生代.老年代 Java 中的堆是 JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象. 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young ).老年代 ( ...
- Sublime中文编码问题
1. 改配置 Preferences->Settings 三个全部加上 "default_encoding": "UTF-8" 2. 代码编写 2.1 ...
- python 正则表达式Re
Python正则表达式指南这篇文章很好,推荐阅读. 本文则是简单记录下我自己学习Re的笔记, 环境是python3.5. 1.简单的Re语法 ^ 匹配字符串开始位置. $ 匹配字符串结束位置. \b ...
- ScalaPB(4): 通用跨系统protobuf数据,sbt设置
我们知道,在集群环境节点之间进行交换的数据必须经过序列化/反序列化处理过程,而在这方面protobuf是一个比较高效.易用的模式.用户首先在.proto文件中用IDL来定义系统中各种需要进行交换的数据 ...
- 《T-SQL查询》读书笔记Part 1.逻辑查询处理知多少
一.关于T-SQL T-SQL是ANSI和ISO SQL标准的MS SQL扩展,其正式名称为Transact-SQL,但一般程序员都称其为T-SQL. 二.逻辑查询处理各个阶段 2.1 逻辑查询处理流 ...
- PAT1133:Splitting A Linked List
1133. Splitting A Linked List (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- java并发之TimeUnit理解
TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段时间里Thread的sle ...
- Clloection接口 与List接口
collection接口: collection是单列集合接口的根接口,该接口中又包含了多个集合接口,collection接口提供了很多操作集合的方法,比如添加元素的方法,删除元素的方法,修改元素的方 ...