ES6新特性Async

更新日期: 2019-08-28阅读: 1.7k标签: async

基本概念

Async实际上是一个封装了自动化执行并返回一个Promise的Generator函数语法糖。这句话的意思我们可以分为三个部分来解读:

首先它有一个自动化执行,Generator函数是依靠不停的调用.net来依次执行的,Async有一个自动化执行的过程。

第二个,它返回一个Promise,也就是说在Async函数里面我们拿到它的结果需要调用promise.then。

Generator函数的语法糖。

不添加自动化执行脚本的函数:

function resolveAfter2Seconds(value) {
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(value);
        },2000);
    })
}

const generator = function* () {
  const value1 = yield resolveAfter2Seconds(1);
  const value2 = yield resolveAfter2Seconds(2);
  console.log(value1);
  console.log(value2);
};

Generator自动化执行的脚本:

function co(generatorFunction){
    return new Promise(function(resolve, reject) {
        const generator = generatorFunction();
        function step(nextF) {
            let next;
            try {
                next = nextF();
            } catch(e) {
                return reject(e);
            }
            // 如果遍历已经结束了
            if(next.done) {
                return resolve(next.value);
            }
            Promise.resolve(next.value).then(function(v) {
                step(function() {
                    return generator.next(v);
                });
            },function(e) {
                step(funciton() {
                    return generator.throw(e);
                });
            });
        }
        step(function() {
            return generator.next(undefined);
        });
    });
}

co(generator);
/*
(4s后)
1
2
*/


const async = async function () {
  const value1 = await resolveAfter2Seconds(1);
  const value2 = await resolveAfter2Seconds(2);
  console.log(value1);
  console.log(value2);
};
async().then(res => {
  console.log(res);
})

/*
(4s后)
1
2
*/

async function asyncFunc() {};
const asyncFunc = async function () {};
const asyncFunc = async () => {};
const obj = {
  async asyncFunc() {}
}

语法

首先,最重要的一点是它返回一个Promise对象,也就是说,在Async里面,在它后面我们想要得到函数的执行结果,必须使用一个.then()。

async function asyncGun() {
    return 'Eric';
}

asyncFunc().then(value => console.log(value));
// Eric 

第二个,await遇到了一个非Promise,直接返回:

async function asyncFunc(){
    return await 'Eric';
}

asyncFunc().then(value => console.log(value));
// Eric

thenable(带有then方法的一个函数)对象等同于Promise。

class Thenable {
    constructor(timeout) {
        this.timeout = timeout;
    }
    then(resolve, reject) {
        setTimeout{
            () => resolve('resolve'),
            this.timeout
        };
    }
}

Async函数任何一个await返回reject,那么就会导致整个Async的中断执行。

promise.all(),只有当它内部所有的子promise全部reslove时,整个promise才会resolve,只要有一个reject,那么整个promise.all就会reject,aysnc同样的原理。


注意事项

尽量使用try...catch代码块,因为一旦用到了Async,显然这个场景肯定是有多个不方便操作的,这个时候为了防止中间出错,最好使用一个try...catch 的代码块,然后在catch代码块的内部加上我们的一些备用数据

非继发的await同时执行,继发就是一个接一个也就是前面一个函数的输出是后面一个函数的输入,类似于函数式编程里面的compose。 对于继发的我们没有办法只能等待前面的操作完再去执行后续操作。

function resolveAfter2Seconds(value){
    return new Promise(resolve => {
      setTimeout(() => {
            resolve(value);
      },2000);
    });
};

const async = async function(){
    const value1 = await resolveAfter2Seconds(1);
    const value2 = await resolveAfter2Seconds(2);
    console.log(value1);
    console.log(value2);
};
async().then(res => {})
// 4s 后输出
   1
   2

怎么样才能让两者同步执行,可以有两种办法。 第一种,使用Promise.all()将它封装起来:

function resolveAfter2Seconds(value){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(value);
        },2000);
    });
}

const async = async function() {
    const [value1,value2] = await Promise.all([resolveAfter2Seconds(1), resolveAfter2Seconds(2)])
    console.log(value1);
    console.log(value2);
};
async().then(res => {});
// 2s后输出
   1
   2

第二种,先执行再await,也就是把异步的一个操作赋值给一个变量:

function resolveAfter2Seconds(value){
    return new Promise(resolve => {
        setTimeout(() => {
            resolve(value);
        },2000);
    });
}

const async = async function() {
    const vpromise1 = resolveAfter2Seconds(1);
    const vpromise2 = resolveAfter2Seconds(2);
    const value1 = await vpromise1;
    const value2 = await vpromise2;
    console.log(value1);
    console.log(value2);
}
async().then(res => {});
// 2s 后输出
   1
   2

链接: https://www.fly63.com/article/detial/4989

JS中的async/await的执行顺序详解

虽然大家知道async/await,但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await

Node.js Async 函数最佳实践

Node.js7.6起, Node.js 搭载了有async函数功能的V8引擎。当Node.js 8于10月31日成为LTS版本后,我们没有理由不使用async函数。接下来,我将简要介绍async函数,以及如何改变我们编写Node.js应用程序的方式。

将async/await编译到 ES3/ES5 (外部帮助库)

自2015年11 发布1.7版以来,TypeScript 已支持 async/await 关键字。编译器使用 yield 将异步函数转换为生成器函数。这意味着咱们无法针对 ES3 或 ES5,因为生成器仅在 ES6 中引入的。

你可能忽略的 async/await 问题

async/await 大家肯定都用过,在处理异步操作的时候真的是很方便。那今天主要讲一些在使用 async/await 时容易忽略和犯错的地方。上面的代码中,每一行都会 等待上一行的结果返回后才会执行。

使用async await通过for循环在图片onload加载成功后获取成功的图片地址

有一个图片列表,我想要在图片onload成功之后获取加载成功的图片列表,图片资源加载为异步,我们使用ES7的async await方式实现,多张图片,是用for循环。

ES8 Async 和 Await

Async 和 Awaiit 是 Promise 的扩展,我们知道 JavaScript 是单线程的,使用 Promise 之后可以使异步操作的书写更简洁,而 Async 使 Promise 像同步操作

有了 Promise 和 then,为什么还要使用 async?

最近代码写着写着,我突然意识到一个问题——我们既然已经有了 Promise 和 then,为啥还需要 async 和 await?这不是脱裤子放屁吗?

手写async await的最简实现

如果让你手写async函数的实现,你是不是会觉得很复杂?这篇文章带你用20行搞定它的核心。经常有人说async函数是generator函数的语法糖,那么到底是怎么样一个糖呢?让我们来一层层的剥开它的糖衣。

认识async/await

async/await是ES7的写法,可以让非同步call back写法看起来像同步的顺序去执行。以下我们new一个Promise的class并return给一个function

如何解决async await处理异常问题

决心还是起来把今天白天工作期间反问一个小伙伴的async&await问题。实际上这个问题之前我就一直想写点什么,只是奈何懒的很,一直没有行动

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!