美文网首页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