ES6笔记 21.async与await、ES6的模块化

Generator 函数方法扩展

1.Generator.prototype.return()

function* demo1() {
  yield 1;
  yield 2;
}
var iter1 = demo1();
console.log(iter1.next()); // {value: 1, done: false}
console.log(iter1.next()); // {value: 2, done: false}
console.log(iter1.next()); // {value: undefined, done: true}

function* demo2() {
  yield 1;
  yield 2;
  return 3;
}
var iter2 = demo2();
console.log(iter2.next()); // {value: 1, done: false}
console.log(iter2.next()); // {value: 2, done: false}
console.log(iter2.next()); // {value: 3, done: true}

function* demo3() {
  yield 1;
  yield 2;
  yield 3;
}
var iter3 = demo3();
console.log(iter3.next()); // {value: 1, done: false}
console.log(iter3.next()); // {value: 2, done: false}
console.log(iter3.return()); // {value: undefined, done: true}
console.log(iter3.next()); // {value: undefined, done: true}
console.log(iter3.next()); // {value: undefined, done: true}

2.Generator.prototype.throw()

var d = function* () {
  try {
    yield;
  } catch (e) {
    console.log("Generator internal Error1" + e);
  }
};
var iter = d();
iter.next();

try {
  iter.throw("err a"); // 这里是迭代器的抛出错误
  iter.throw("err b"); // 迭代器抛出错误后不能再抛出错误所以这里出错
} catch (e) {
  console.log("Error2" + e);
}

async 函数,await 关键字

async 函数本质上就是 Generator 生成器函数,也就是 Generator 生成器的语法糖
await 函数本质上就是将整个 Co 模块进行封装到内部,能够一次性获取到最后 promise 的结果
async 和 await 与*号和 yield 表达式,语义更加清楚,async 表达函数内部有异步操作,await 表示紧跟在后面的表达式需要等待的结果
async 函数 await 命令后面,可以是 Promise 对象和原始值(数值,字符串,布尔值,这时会自动转成 resolved 的 Promise 对象)
返回值是 Promise,async 函数的返回值是 Promise,Generator 函数返回值是迭代器。async 函数可以看作多个异步操作,包装成一个 Promise 对象(通过 Promise.resolve()进行包装),await 命令就是内部 then 命令的语法糖

async function read() {
  let value1 = await readFile("./name.txt", "utf-8");
  let value2 = await readFile(value1, "utf-8");
  let value3 = await readFile(value2, "utf-8");
  return value3;
}
let promise = read();
promise.then((data) => {
  console.log(data);
});

async 函数返回 Promise 对象,必须等待内部所有的 await 命令后面的 Promise 对象执行完,才会发生状态变化,除非遇到 return 语句或者抛出错误;也就是说,只有 async 函数内部的异步操作执行完成,才会执行 then 方法的回调函数
正常情况下,await 命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值;下面代码中,await 命令的参数是 123,这是等于 return 123;然后 async 通过 Promise.resolve()将 123 包装成 Promise 对象

async function demo() {
  return 123;
  // 等同于
  return await 123;
}
demo().then((data) => {
  console.log(data);
});

await 命令后面的 Promise 对象如果变成 reject 状态,则 reject 的参数会被 catch 方法的回调接收

async function demo() {
  await Promise.reject("出错了");
}
var p = demo();
p.then((data) => {
  console.log(data);
}).catch((err) => {
  console.log("rejected: " + err); // rejected: 出错了
});

任何一个 await 语句后面的 Promise 对象变为 reject 状态,那么整个 async 函数都会中断执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值