[EcmaScript] async/await

asyncawait是ES7的提案。

很多第三方庫將它實現(xiàn)成了yield+promise的語法糖的形式。
然而,他們本質(zhì)上卻只需要依賴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);
});

實現(xiàn):

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中是可以運(yùn)行的。

(3)核心是yield

即,用yield實現(xiàn)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);
});

實現(xiàn)方法:

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中是也可以運(yùn)行的。

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

這個當(dāng)然必須也是可以運(yùn)行的了。

(5)用其他異步回調(diào)函數(shù)的寫法

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

這個在實現(xiàn)了sendAjax后,當(dāng)然也是可以運(yùn)行的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 異步編程對JavaScript語言太重要。Javascript語言的執(zhí)行環(huán)境是“單線程”的,如果沒有異步編程,根本...
    呼呼哥閱讀 7,410評論 5 22
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點點福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 6,460評論 9 19
  • 你不知道JS:異步 第四章:生成器(Generators) 在第二章,我們明確了采用回調(diào)表示異步流的兩個關(guān)鍵缺點:...
    purple_force閱讀 1,054評論 0 2
  • 1.async語法 async函數(shù)自帶執(zhí)行器。async函數(shù)的執(zhí)行,與普通函數(shù)一模一樣 await表示緊跟在后面的...
    秦小婕閱讀 1,510評論 0 1
  • 數(shù)算恩福 1.感恩爸媽,兒子小時候睡的床、蓋的被子、玩的車都是爸媽買的,感恩爸媽對我們的愛,謝謝親愛的爸媽,謝謝謝...
    lrryy閱讀 225評論 3 2

友情鏈接更多精彩內(nèi)容