async/await与promise的区别

async:

async 是“异步”的简写, async 用于申明一个异步的 function。

async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对

async函数可以直接then,返回值就是then方法传入的函数。async声明的函数的返回本质是一个Promise。

 

await:

await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。

await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。

await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),

且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。

 

下面用代码进行展示:

function autoGentorat(genF) {
    // 返回一个promise,可以链式调用
    return new Promise(function(resolve, reject) {
        // 实例化实参(实参是传递过来的Generator),获得next方法
        let gen = genF();
        function step(result) {
            // Generator执行到最后,done是true,
            if (result.done) {
                resolve(result.value);
            } else {
                // 没执行完,使用promise的方式让其进行下一步
                // 因为 result你不知道是否是一个异步的操作,所以需要promise
                Promise.resolve(result.value).then(function(res) {
                    // 上一步等待执行结果完毕,进行下一步
                    step(gen.next(res));
                });
            }
        }
        // 开始执行generrator第一步
        step(gen.next(undefined));
    });
}

function getUserInfo(){
    return new Promise(function(resolve,relect){
        setTimeout(function(){
            resolve({name:'小刘鸭'})
        },2000)
    })
}

autoGentorat(function*() {
    yield 1;
    let data = yield getUserInfo();
})

最后总结,async/await与promise的区别:

1.Promise的出现解决了传统callback函数导致的“地狱回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。
2.async await与Promise一样,是非阻塞的。
3.async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。

posted @ 2022-05-08 22:27  Lhaoyu  阅读(4049)  评论(0编辑  收藏  举报