4.4Async函数和异步操作
4.4.1基本概念
4.4.1.1异步
- 简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段。
- ES6诞生以前,异步编程的方法,常见的有下面四种:
- 回调函数
- 事件监听
- 发布/订阅
- Promise 对象
4.4.2Generator函数实现协程
- 协程也是异步编程的解决方案之一。
- Generator函数是协程在ES6的实现,最大特点就是可以交出函数的执行权(即暂停执行)。
- 异步操作需要暂停的地方都用yield语句注明。
- Generator函数不同于普通函数的另一个方面,即执行它不会返回结果,返回的是指针对象
4.4.3async函数
ES7提供了async函数
语法 async function name(param) { statements }
- name: 函数名称。
param: 要传递给函数的参数名称。
statements: 函数体。
- name: 函数名称。
返回值
async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。
async函数内部return语句返回的值,会成为then方法回调函数的参数。
async function foo(){ return "这是async函数的返回值"; } console.log(foo()) // Promise { '这是async函数的返回值' } foo().then((args)=>{ // 回调函数是箭头函数 console.log(args); // 这是async函数的返回值 })
4.4.4await命令
await 操作符用于等待一个 Promise 对象,
它只能在异步函数 async function 内部使用。
await 的返回值
- 如果一个 Promise 被传递给一个 await 操作符,await 将等待 Promise 正常处理完成并返回其处理结果。
- 正常情况下,await命令后面是一个Promise对象。如果不是,会被转成一个已完成状态的Promise对象。
function testAwait (x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 2000); }); } async function foo() { var x = await testAwait ("hello world"); console.log(x); } foo (); // hello world async function f() { return await 123; } f().then(v => console.log(v)) // 123
4.4.5async函数的错误处理
防止出错的方法,把await命令放在try...catch代码块中。
async function f() { try { await new Promise(function (resolve, reject) { throw new Error('出错了'); }); } catch(e) { } return await('hello world'); }