async await 学习、原理、优缺点

特点

1、难点是错误处理机制。
2、await命令只能用在async函数之中,如果用在普通函数,就会报错
3、await 的值可能报错,所以最好放在try catch中执行
4、async 函数可以保留运行堆栈 ,暂时保存当前执行栈

比起来 Generator , async函数有什么优缺点

优点:
1、async函数自带执行器,自动执行,无需next
2、yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。
3、async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator
async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。

注意

  • 如果两个异步方法没有依赖关系,不要写成同步的样子,会阻塞程序执行,最好再用promise.all包装一下,这样连个awiat同步执行

简单实现

原理:一个自动执行的Generator函数

async 转为generrator
await 转为yield

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();
})

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章