美文网首页
async函数

async函数

作者: 猴子精h | 来源:发表于2018-08-24 11:11 被阅读14次

async

要理解 async 先要掌握 Promise 的概念,了解 Promise 请戳我

async 函数是什么?一句话,它就是 Genervator 函数的语法糖。

一个 Genervator 函数,依次读取两个文件。

const fs = require('fs');

const readFile = function(fileName) {
    return new Promise((resolve, reject) => {
        fs.readFile(fileName, (error, data) => {
            if (error) return reject(error);
            reslove(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() {
    // 一旦遇到 await 就先返回,等到异步操作完成再继续执行函数体后面的语句
    const f1 = await readFile('/etc/fstab');
    const f2 = await readFile('/etc/shells');
    console.log(f1.toString());
    console.log(f2.toString());
}

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

// async 返回一个 Promise 对象
async function f() {
    return 'hello world';
}

// .then 调用 Promise 对象
f().then(v => console.log(v));
// "hello world"

async 内部抛出的异常会导致 Promise 对象变成 reject 的状态,能够被 catch 捕获。

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

f().then(v => console.log(v))
   .catch(e => console.log(e));
// Error: 出错了

await

正常情况下,await 命令后面是一个 Promise 对象。如果不是,会被转换成一个立即 resolve 的 Promise 对象。

async funciton () {
    return await 123;
}

f().then(v => console.log(v));
// 123

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

async function f() {
    await Promise.reject('出错了');
    await Promise.reslove('hello world'); // 不会执行
}

如果需要避免这个问题,可以是用 try...catch

async function f() {
  try {
    await Promise.reject('出错了');
  } catch(e) {
  }
  return await Promise.resolve('hello world');
}

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

案例: 按顺序完成异步操作

实际的开发中,经常遇到一组异步操作需要按顺序完成。比如,以此远程读取一组 URL,然后按照读取顺序依次输出。

async function loginOrder(urls) {
    // 并发读取远程URL
    const textPromises = urls.map(async url => {
        const response = await fetch(url);
        return response.text();
    })

    // 按次序输出
    for (const textPromise of textPromises) {
        console.log(await textPromise);
    }
}

参考

相关文章

  • async和await的使用

    async函数 什么是async函数? async函数是使用async关键字声明的函数。 mdn文档:https:...

  • JS中的async/await -- 异步隧道尽头的亮光

    async函数 简单解释async函数就是Generator函数的语法糖。 Generator函数写法 async...

  • 2018-05-22

    async 函数 1. 含义 async 函数是 Generator 函数的语法糖。async函数将Generat...

  • ES8(13)、await 和 async 的用法

    async函数是使用async关键字声明的函数。 async函数是AsyncFunction构造函数的实例, 并且...

  • async函数

    async函数 async函数的含义 简单来说:async 函数就是 Generator 函数的语法糖下面是两个是...

  • ES8-async&await

    async函数是使用async关键字声明的函数,async函数是AsyncFunction构造函数的实例,返回值是...

  • async 函数(转载)

    async 函数 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 async 函数是...

  • ES7 Async/Await快速入门

    用法: 使用async 声明函数,在async函数内使用await async function xxx(){aw...

  • ES6——异步操作

    async 函数 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。async 函数是什么?一...

  • async/await 原理及简单实现

    解决函数回调经历了几个阶段, Promise 对象, Generator 函数到async函数。async函数目...

网友评论

      本文标题:async函数

      本文链接:https://www.haomeiwen.com/subject/surbiftx.html