async/await

Posted 前端纸飞机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了async/await相关的知识,希望对你有一定的参考价值。

是es7推出的一套关于异步的终极解决方案。用同步的思维来解决异步问题。

更多异步解决方案可见:❤️前端异步解决方案大全最新版❤️(2021版)_纸飞机博客-CSDN博客

async

1,async作为关键字放到函数前面,用于表示函数是一个异步函数。该函数的执行不会阻塞后面代码的执行。

2,async函数返回的是一个promise对象,可以调用then方法获取到promise的结果值。

3,async返回promise原理:如果async函数中有返回一个值,当调用该函数时,内部会调用Promise.resolve()方法把它转化成一个promise对象作为返回。

async function timeout() {
    return 'hello world'
}
    
timeout().then(result => {
    console.log(result);}
)
    
console.log('先执行')
    
//先执行  
// hello world

await

1,await操作符用于等待一个promise对象,其后必须跟promise对象(不是的话也会强制转化)。代码需要等待promise有了返回结果之后,才继续执行下面的代码。

2,await关键字只能放async函数里面。 而async函数里不是必须有await。

3,await关键字的返回结果就是其后 promise执行的结果值,是resolved或者 rejected后的值。

// 2s之后返回双倍的值
function double(num) { 
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2 * num)
        },2000);
    })
}
async function test() { 
    let result = await double(30);
    console.log(result);
}
test();

//2s 之后,输出60

async/await

异步代码就像写同步代码一样,也避免了回调地狱。

async function testTwo() {
  let first = await double(30);
  let second = await double(50);
  let third = await double(30);
  console.log(first + second + third);
}

testTwo();

6秒后,控制台输出220。

async/await 原理

async/await语法糖利用Generator函数 +自动执行器来运作,await类似yield,但 await 后需跟promise。

generator生成的迭代器是手动调用next直到return,而async/await自带执行器,是自动next。其时机是当await后的promise有结果时则自动调用next(即开始下一个 promise),并将当前promise结果值传递给next为参数作为上一个yield (await)的返回值。

所以,async/await 是基于 Promise 的 Generator的自动执行

//异步函数需包装成promise对象
function readFile(fileName) {
  return new Promise((resolve, reject) => {
    fs.readFile(fileName, (error, data) => {
      if (error) {
        reject(error);
      } else {
        resolve(data);
      }
    });
  });
}
// Generator函数
let gen = function* () {
  let rl = yield readFile("./package.json");
  console.log(rl.toStringO);
  let r2 = yield readFile("./index.js");
  console.log(r2.toString());
};
//自动执行器
function run(gen) {
  let g = gen();
  function _next(data) {
    let result = g.next(data);
    if (result.done) {
      return result.value;
    }
    result.value.then((data) => _next(data));
  }
  _next();
}
//调用
run(gen);

以上是关于async/await的主要内容,如果未能解决你的问题,请参考以下文章

Async/Await替代Promise的理由

promise与async和await的区别

Async/Await是这样简化JavaScript代码的

使用 Async/Await 控制哪些代码停止

如何优雅处理 async await 错误——解读小而美的 awaitjs 库

Gulp/Typescript/Async/Await 代码不起作用 - 为啥?