美文网首页JavaScript
[EcmaScript] async/await

[EcmaScript] async/await

作者: 何幻 | 来源:发表于2016-03-07 07:19 被阅读132次

asyncawait是ES7的提案。

很多第三方库将它实现成了yield+promise的语法糖的形式。
然而,他们本质上却只需要依赖yield就够了promise只是一种用法。

(1)async和await

async function say(greeting){
    return new Promise(function(resolve,then){
        setTimeout(function(){
            resolve(greeting);
        },1500);
    });
}

(async function(){
    var v1=await say('Hello');
    console.log(v1);

    var v2=await say('World');
    console.log(v2);
}());

(2)yield+promise的语法糖

用例:

yieldPromise(function*(){
    var v1=yield new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve('Hello');
        },1500);
    });

    console.warn(v1);

    var v2=yield new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve('World');
        },1500);
    });

    console.warn(v2);
});

实现:

function yieldPromise(generator){
    var iterator=generator();
    recursiveCore.call(iterator);
}

function recursiveCore(feedback){
    var iterator=this,
        result=iterator.next(feedback);

    if(result.done){
        return;
    }

    var promise=result.value;
    Promise.resolve(promise).then(function(v){
        recursiveCore.call(iterator,v);
    });
}

这个在Chrome中是可以运行的。

(3)核心是yield

即,用yield实现call/cc

用例:

yieldContinuation(function*(){
    var v1=yield function(k){
        setTimeout(function(){
            k('Hello');
        },1500);
    };

    console.warn(v1);

    var v2=yield function(k){
        setTimeout(function(){
            k('World');
        },1500);
    };

    console.warn(v2);
});

实现方法:

function yieldContinuation(generator){
    var iterator=generator();
    recursiveCore.call(iterator);
}

function recursiveCore(feedback){
    var iterator=this,
        result=iterator.next(feedback);

    if(result.done){
        return;
    }

    varyieldFunc=result.value;
    yieldFunc(function(v){
        recursiveCore.call(iterator,v);
    });
}

这个在Chrome中是也可以运行的。

(4)用promise的写法

yieldContinuation(function*(){
    var v1=yield function(k){
        new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve('Hello');
            },1500);
        }).then(k);
    };

    console.warn(v1);

    var v2=yield function(k){
        new Promise(function(resolve,reject){
            setTimeout(function(){
                resolve('World');
            },1500);
        }).then(k);
    };

    console.warn(v2);
});

这个当然必须也是可以运行的了。

(5)用其他异步回调函数的写法

如ajax

yieldContinuation(function*(){
    var v1=yield function(k){
        sendAjax({
            url:'/',
            success:k
        });
    };

    console.warn(v1);

    var v2=yield function(k){
        sendAjax({
            url:'/',
            success:k
        });
    };

    console.warn(v2);
});

这个在实现了sendAjax后,当然也是可以运行的。

相关文章

网友评论

    本文标题:[EcmaScript] async/await

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