ES6中的await和then的区别

使用.then

1.先用async定义一个函数fn2只让它返回数字1

async function fn2(){

    return 1

}

2.定义一个普通函数fn3,让它console打印一个数字123

function fn3(){

    console.log('fn123')

}

3.定义一个变量_fn2,把fn2函数执行的结果保存在_fn2中——>返回一个promise对象。因为async会通过Promise.resolve()把返回值封装成promise对象

let _fn2=fn2();

console.log(_fn2)

4.在定义fn1函数,里面调用_fn2.then方法

let _fn2=fn2();

    console.log(_fn2)

const fn1=()=>{

    _fn2.then(()=>{

            fn3()

        } )

}

fn1()

现在执行fn1(),结果显示promise和fn123,执行期间发生了什么?

1.fn2返回一个promise,在某个时刻会resolve

2. .then已经被添加到链式回调,在这种情况下,fn1函数执行结束之后,fn1函数并不会暂停,所以在fn2 resolve时,fn1函数的作用于已经没有了,如果fn2或者fn3报错,那么堆栈信息中应该包括fn1函数,但是fn1作用于已经消失JS引擎就会额外的记录堆栈信息,记录fn1,把fn1附加到fn2返回的promise中,并往下传递,这样fn3在需要的时候可以被允许获得堆栈信息=>降低性能,占用内存


使用await

1.async函数b,返回数字1

async function b(){

    return 1

}

2.创建普通函数c,console打印cccc

function c(){

    console.log('cccc')

}

3.在const a,给它赋值匿名函数,在它前边添加asnyc,在里面用await关键字执行函数b,再下一行调用c()函数

const a=ansyc()=>{

    await b();

    c();   

}

a()

1.首先执行了await b,然后是c函数,打印cccc

2.期间发生了什么?await b()会暂停它所在的async函数的执行,直到异步的函数b执行结束之后,再执行函数c,await得到promise对象,await阻塞后续的代码,等到promise对象resolve,得到resolve的值,并作为await的结果返回

3.区别:await不需要保存当前的堆栈信息,在执行函数b的时候,函数a暂停执行,作用域仍然存在,如果函数b,c报错,都可以直接生成相对应的堆栈信息=>速度更快,节省内存

async内部的阻塞都在promise对象中异步执行,.then和await在堆栈信息存在区别

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容