美文网首页
Async/await

Async/await

作者: wade3po | 来源:发表于2019-02-09 19:42 被阅读19次

JavaScript的异步一直是JavaScript的一个复杂的事,从回调到Promise再到Generator,直到async/await,都是为了解决异步操作带来的麻烦。

先说说async,async是异步的意思,异步就表示不会阻塞代码执行,async写在一个函数声明之前,看个简单的例子:

async function fn() {
    console.log('async方法');
}
console.log('不会阻塞');

console.log('不会阻塞');执行了,所以async是异步的。但是加了async返回的是什么,我们可以console.log(fn())得到:

Promise {<resolved>: undefined}

所以async返回了一个Promise。之前我们讲过Promise,那么我们可以直接调用:

async function fn() {
    return '成功resolve';
}
fn(true).then((res) => {
    console.log(res);
});

这样看来,async好像只是用来生成一个Promise对象,没有什么用,那么这时候就要说一下await了,这两个一般会配套使用,一起出现。需要注意, await 关键字仅仅在 async function中有效。如果在 async function函数体外使用 await ,你只会得到一个语法错误(SyntaxError)。

await会使 async 函数暂停执行,等待 Promise 的结果出来,然后恢复async函数的执行并返回解析值(resolved)。所以await之后需要的是一个Promise对象。

var pro1 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        console.log('正在执行.....');
        resolve('成功1');
        console.log('执行完毕.....');
    }, 2000);
});

var pro2 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        console.log('正在执行.....');
        reject('成功2');
        console.log('执行完毕.....');
    }, 4000);
});


async function fn() {
    var res1 = await pro1;
    console.log(res1);
    var res2 = await pro2;
    console.log(res2);
}

fn();

我们可以看见,Promise对象里面很早就执行了,但是await之后一定会等到Promise成功返回才会向下执行。其中要是有一个返回reject的话也不会向下执行。

这样看起来跟Promise.then很像,但是两者不能混淆:

async function fn() {
    var i = 0;
    setInterval(function () {
        console.log(i++);
    }, 1000);
    var res1 = await pro1;
    console.log(res1);
    var res2 = await pro2;
    console.log(res2);
}

我们可以知道两个计时器是同时调用的,但是第二个计时器还是会在await之后输出,但是这两个计时器是在同一个事件队列进行,时间是根据最耗时的那个方法。而then方法则不是:

var i = 0;
setInterval(function () {
    console.log(i++)
}, 1000);
new Promise(function(resolve, reject){
    setTimeout(function () {
        resolve('star');
    }, 2000);
}).then(function(data){
    return new Promise(function(resolve, reject){
        setTimeout(function () {
            resolve('two result');
        }, 4000);
    });
}).then(function (value) {
    console.log(value);
}).catch(function(err){
    console.log('err: ', err);
});

到最后的输出结果用了6秒,所以两者是不同的。

看起来async/await跟Promise差不多,确实是,在不考虑太多的情况下,使用Promise反而更直接,但是在太多耗时很久的异步下,async/await会是更好的选择,语义也更清晰。

当然,在平时业务开发,很少用到这些,但是不保证会用到的时候。

欢迎关注Coding个人笔记 公众号

相关文章

  • async和await

    浅谈Async/Await用 async/await 来处理异步 async和await async:声明一个异步...

  • ES8(一) —— async&await

    目录 async和普通函数的区别 await async/await处理多回调异步 async和await必须配合...

  • async

    async/await特点 async/await更加语义化,async是“异步”的简写,async functi...

  • ES6中的好东西

    1 Await/Async 前端的回调时代我没有赶上,我赶上的是await/async时代。await和async...

  • Vue接口调用方式(三)async/await用法

    async/await用法 1. async/await的基本用法 async/await是ES7引入的新语法,可...

  • nodejs async 使用简介

    async await node async 使用

  • JS 中的 async/await

    async/await 是什么? async/await 是 ES2017 中新增的异步解决方案; await 只...

  • ES2017 async 函数

    async 和 await 在干什么 每个名称都有意义async : 异步await: async wait简...

  • async/await

    async/await async/await 是Generator的语法糖。 Generator 通过将Gene...

  • 小程序-云开发

    async和await async:异步(无等待)await:等待(是为了同步) 一、await 关键字只在 as...

网友评论

      本文标题:Async/await

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