成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

generator、co模塊和async三者的區(qū)別

lanffy / 1422人閱讀

摘要:也就是說,函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。表示函數(shù)里有異步操作,表示緊跟在后面的表達(dá)式需要等待結(jié)果。函數(shù)庫約定,命令后面只能是函數(shù)或?qū)ο螅瘮?shù)的命令后面,可以跟對象和原始類型的值數(shù)值字符串和布爾值,但這時等同于同步操作。

generator 特點

function*

可以使用yield返回多次

調(diào)用方法

使用next()執(zhí)行g(shù)enerator代碼,每次遇到y(tǒng)ield就返回一個對象{ value: x, done: true/false }, 如果donetrue,則value就是return的返回值,沒有return就返回undefined,如果return語句后面還有yield,這個generator對象就全部執(zhí)行完成,不要再繼續(xù)調(diào)用next()

直接用for ... of循環(huán)迭代generator對象,這種方式不需要我們自己判斷done

for (var x of fib(5)) {
    console.log(x); // 依次輸出0, 1, 1, 2, 3
}

如果給next方法傳參數(shù), 那么這個參數(shù)將會作為上一次yield語句的返回值

function* foo(x) {
    var y = 2 * (yield (x + 1));
    var z = yield (y / 3);
    return (x + y + z);
}

var a = foo(5);
a.next() // Object{value:6, done:false}
a.next() // Object{value:NaN, done:false}
a.next() // Object{value:NaN, done:true}

var b = foo(5);
b.next() // { value:6, done:false }
b.next(12) // { value:8, done:false }
b.next(13) // { value:42, done:true }
作用

ajax的異步處理

function* main() {
    var result = yield request("http://www.filltext.com?rows=10&f={firstName}");
    console.log(result);
    //do 別的ajax請求;
}
co模塊 模塊思路

co 模塊的思路就是利用 generator 的這個特性,將異步操作跟在 yield 后面,當(dāng)異步操作完成并返回結(jié)果后,再觸發(fā)下一次 next() 。當(dāng)然,跟在 yield 后面的異步操作需要遵循一定的規(guī)范 thunks 和 promises。

function co(gen) {
    var it = gen();
    var ret = it.next();
    ret.value.then(function(res) {
        it.next(res);
    });
}
function sayhello() {
    return Promise.resolve("hello").then(function(hello) {
        console.log(hello);
    });
}
co(function *helloworld() {
    yield sayhello();
    console.log("world");
});
async優(yōu)點

內(nèi)置執(zhí)行器。 Generator 函數(shù)的執(zhí)行必須靠執(zhí)行器,所以才有了 co 函數(shù)庫,而 async 函數(shù)自帶執(zhí)行器。也就是說,async 函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。

更好的語義。 async 和 await,比起星號和 yield,語義更清楚了。async 表示函數(shù)里有異步操作,await 表示緊跟在后面的表達(dá)式需要等待結(jié)果。

更廣的適用性。 co 函數(shù)庫約定,yield 命令后面只能是 Thunk 函數(shù)或 Promise 對象,而 async 函數(shù)的 await 命令后面,可以跟 Promise 對象和原始類型的值(數(shù)值、字符串和布爾值,但這時等同于同步操作)。

Express 和 Koa 的區(qū)別 Express

優(yōu)點:線性邏輯,通過中間件形式把業(yè)務(wù)邏輯細(xì)分、簡化,一個請求進(jìn)來經(jīng)過一系列中間件處理后再響應(yīng)給用戶,清晰明了。
缺點:基于 callback 組合業(yè)務(wù)邏輯,業(yè)務(wù)邏輯復(fù)雜時嵌套過多,異常捕獲困難。

Koa

優(yōu)點:首先,借助 co 和 generator,很好地解決了異步流程控制和異常捕獲問題。其次,Koa 把 Express 中內(nèi)置的 router、view 等功能都移除了,使得框架本身更輕量。
缺點:社區(qū)相對較小。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90119.html

相關(guān)文章

  • 夯實基礎(chǔ)-JavaScript異步編程

    摘要:調(diào)用棧被清空,消息隊列中并無任務(wù),線程停止,事件循環(huán)結(jié)束。不確定的時間點請求返回,將設(shè)定好的回調(diào)函數(shù)放入消息隊列。調(diào)用棧執(zhí)行完畢執(zhí)行消息隊列任務(wù)。請求并發(fā)回調(diào)函數(shù)執(zhí)行順序無法確定。 異步編程 JavaScript中異步編程問題可以說是基礎(chǔ)中的重點,也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執(zhí)行的時候是從上到下按順序執(zhí)行,一段代碼執(zhí)行了之后才會執(zhí)行下一段代碼,這種方式...

    shadowbook 評論0 收藏0
  • 異步流程控制:7 行代碼學(xué)會 co 模塊

    摘要:而在中是迭代器生成器,被創(chuàng)造性的拿來做異步流程控制了。當(dāng)執(zhí)行的時候,并不執(zhí)行函數(shù)體,而是返回一個迭代器。行代碼再看看文章開頭的行代碼首先生成一個迭代器,然后執(zhí)行一遍,得到的是一個對象,里面再執(zhí)行。 廣告招人:阿里巴巴招前端,在這里你可以享受大公司的福利和技術(shù)體系,也有小團(tuán)隊的挑戰(zhàn)和成長空間。聯(lián)系: qingguang.meiqg at alibaba-inc.com 首先請原諒我的標(biāo)題...

    tinna 評論0 收藏0
  • 【面試篇】寒冬求職季之你必須要懂原生JS(中)

    摘要:如果你還沒讀過上篇上篇和中篇并無依賴關(guān)系,您可以讀過本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個小時才完成這篇文章,篇幅較長,希望大家閱讀時多花點耐心,力求真正的掌握相關(guān)知識點。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就能獲得...

    andycall 評論0 收藏0
  • 【面試篇】寒冬求職季之你必須要懂原生JS(中)

    摘要:如果你還沒讀過上篇上篇和中篇并無依賴關(guān)系,您可以讀過本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個小時才完成這篇文章,篇幅較長,希望大家閱讀時多花點耐心,力求真正的掌握相關(guān)知識點。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就...

    Mike617 評論0 收藏0
  • js 處理異步操作幾種方式

    摘要:如果我們只有一個異步操作,用回調(diào)函數(shù)來處理是完全沒有任何問題的。事件監(jiān)聽使用事件監(jiān)聽的方式番禺廣州上述代碼需要實現(xiàn)一個事件監(jiān)聽器。只處理對象廣州番禺函數(shù)將函數(shù)的自動執(zhí)行器,改在語言層面提供,不暴露給用戶。 概論 由于 JavaScript 是一門單線程執(zhí)行的語言,所以在我們處理耗時較長的任務(wù)時,異步編程就顯得尤為重要。js 處理異步操作最傳統(tǒng)的方式是回調(diào)函數(shù),基本上所有的異步操作都可以...

    Meils 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<