博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript的async 的学习
阅读量:6277 次
发布时间:2019-06-22

本文共 1980 字,大约阅读时间需要 6 分钟。

async 函数

ES2017 标准引入了 async 函数,使得异步操作变得更加方便,就是 Generator 函数的语法糖。

对比一下:

const fs = require('fs');const readFile = function (fileName) {  return new Promise(function (resolve, reject) {    fs.readFile(fileName, function(error, data) {      if (error) return reject(error);      resolve(data);    });  });};const gen = function* () {  const f1 = yield readFile('/etc/fstab');  const f2 = yield readFile('/etc/shells');  console.log(f1.toString());  console.log(f2.toString());};

async的书写

const asyncReadFile = async function () {  const f1 = await readFile('/etc/fstab');  const f2 = await readFile('/etc/shells');  console.log(f1.toString());  console.log(f2.toString());};

async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已。

async的优点

async的书写方式,比之前的promise、genenator方式都好,以下四点优势:

  1. 内置执行器。
    async函数的执行,与普通函数一模一样,只要一行。function(),这样就可以执行,不像 Generator 函数,需要调用next方法,或者用co模块,才能真正执行,得到最后结果。
  2. 更好的语义
    async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
  3. 更广的适用性
    yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作)。
  4. 返回值是 Promise
    async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。

进一步说,async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。

返回值

async函数返回一个 Promise 对象。async函数内部return语句返回的值,会成为then方法回调函数的参数。

async function f() {  return 'hello world';}f().then(v => console.log(v))// "hello world"

上面代码中,函数f内部return命令返回的值,会被then方法回调函数接收到。async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。

async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

await

正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。上面代码中,await命令的参数是数值123,它被转成 Promise 对象,并立即resolve。

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

async function f() {  await Promise.reject('出错了');}f().then(v => console.log(v)).catch(e => console.log(e))// 出错了

只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行。

以上都是学习过程的笔记。

转载地址:http://zlgpa.baihongyu.com/

你可能感兴趣的文章
%Error opening tftp://255.255.255.255/cisconet.cfg
查看>>
java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
查看>>
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数
查看>>
python多线程队列安全
查看>>
[汇编语言学习笔记][第四章第一个程序的编写]
查看>>
android 打开各种文件(setDataAndType)转:
查看>>
补交:最最原始的第一次作业(当时没有选上课,所以不知道)
查看>>
Vue实例初始化的选项配置对象详解
查看>>
PLM产品技术的发展趋势 来源:e-works 作者:清软英泰 党伟升 罗先海 耿坤瑛
查看>>
vue part3.3 小案例ajax (axios) 及页面异步显示
查看>>
浅谈MVC3自定义分页
查看>>
.net中ashx文件有什么用?功能有那些,一般用在什么情况下?
查看>>
select、poll、epoll之间的区别总结[整理]【转】
查看>>
CSS基础知识(上)
查看>>
PHP中常见的面试题2(附答案)
查看>>
26.Azure备份服务器(下)
查看>>
mybatis学习
查看>>
LCD的接口类型详解
查看>>
Spring Boot Unregistering JMX-exposed beans on shutdown
查看>>
poi 导入导出的api说明(大全)
查看>>