前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >node.js的async和await

node.js的async和await

作者头像
雪山飞猪
发布2019-08-29 14:46:20
1.3K0
发布2019-08-29 14:46:20
举报
文章被收录于专栏:雪山飞猪雪山飞猪

一、async和await是什么

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

  • async表示函数里有异步操作
  • await表示在后面的表达式需要等待结果
  • async函数返回的是一个Promise对象,可以使用then方法添加回调函数,一旦遇到await就会先返回。

二、node异步编程演进的四个阶段

我们来回顾一下异步编程的写法的演进过程

第一阶段 通过回调函数

代码语言:javascript
复制
fs.readFile('/etc/passwd', 'utf-8', function (err, data) {
  if (err) throw err;
  console.log(data);
})

这样的方式会造成嵌套过多,在调用过多的时候,就变成了下面这样的写法,传说中的callback hell

代码语言:javascript
复制
fs.readFile(fileA, 'utf-8', function (err, data) {
    fs.readFile(fileB, 'utf-8', function (err, data) {
        fs.readFile(fileC, 'utf-8', function (err, data) {
            // ...
        });
    });
});

2. 第二阶段 通过Promise

Promise 对象允许将回调函数的嵌套,改成链式调用。 采用 Promise,连续读取多个文件,写法如下。

代码语言:javascript
复制
const readFile = function (fileName) {
  return new Promise(function (resolve, reject) {
    fs.readFile(fileName, function(error, data) {
      if (error) return reject(error);
      resolve(data);
    });
  });
};

当操作很多的时候就变成了下面这样的写法

代码语言:javascript
复制
var readFile = require('fs-readfile-promise');

readFile(fileA)
.then(function (data) {
  console.log(data.toString());
})
.then(function () {
  return readFile(fileB);
})
.then(function (data) {
  console.log(data.toString());
})
.catch(function (err) {
  console.log(err);
});

这样虽然比callback好了,但是有一个问题是代码冗余,不管什么操作,看上去都是一堆then

3.第三个阶段 通过Generator函数

代码语言:javascript
复制
function* asyncJob() {
  // ...其他代码
  var f = yield readFile(fileA);
  // ...其他代码
}

函数asyncJob是一个协程,协程遇到yield命令就暂停,等到执行权返回,再从暂停的地方继续往后执行,这样的写法非常像同步操作。 要想使用yield方法,得不停地执行next()切换到下一个yeild,调用变成了下面这样

代码语言:javascript
复制
var fs = require('fs');

var readFile = function (fileName){
  return new Promise(function (resolve, reject){
    fs.readFile(fileName, function(error, data){
      if (error) return reject(error);
      resolve(data);
    });
  });
};

var gen = function* (){
  var f1 = yield readFile('/etc/fstab');
  var f2 = yield readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

第4个阶段 通过async和await

async 函数本质就是 Generator 函数的语法糖 最后演变成了下面这样的写法

代码语言:javascript
复制
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和await,比起*和yield,语义更清楚了。 async表示函数里有异步操作,await表示在后面的表达式需要等待结果 async函数的返回值是Promise对象 await后面,可以是Promise对象和原始类型的值(数值、字符串和布尔值,会自动转换成resolved的Promise对象)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、async和await是什么
  • 二、node异步编程演进的四个阶段
    • 第一阶段 通过回调函数
      • 2. 第二阶段 通过Promise
        • 3.第三个阶段 通过Generator函数
          • 第4个阶段 通过async和await
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档