Bootstrap

ES6——async函数 .

一、概念

async函数:处理异步编程 类似状态机; 封装多个promise进行异步编程

也就是 Generator 函数的语法糖。

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

将 Generator 函数的星号(*)替换成async,将yield替换成await:

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

特点:

  1. async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果
  2. async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)
  3. async函数的返回值是 Promise 对象
  4. async函数内部return语句返回的值,会成为then方法回调函数的参数

针对3、4:

async function f() {
   
  return 'hello world';
}

f().then(v => console.log(v))
// "hello world"

async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到

async function f() {
   
  throw new Error('出错了');
}

f().then(
  v => console.log('resolve', v),
  e => console.log('reject', e)
)
//reject Error: 出错了

二、对比 Promise联用Generator && Promise联用async

1.Promise联用Generator

    let fun= function () {
   
        return new Promise(function (resolve,reject) {
   
            setTimeout(function () {
   
                resolve("数据");
            },2000)
        })
    }
    
    let f= function* () {
   
        yield fun();
    }
    let inter=f();
    //console.log(inter.next()); //{value: Promise, done: false}
    inter.next().value.then(function (res) {
   
        console.log(res
;