摘要:也就是說(shuō),函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。表示函數(shù)里有異步操作,表示緊跟在后面的表達(dá)式需要等待結(jié)果。函數(shù)庫(kù)約定,命令后面只能是函數(shù)或?qū)ο螅瘮?shù)的命令后面,可以跟對(duì)象和原始類型的值數(shù)值字符串和布爾值,但這時(shí)等同于同步操作。
generator 特點(diǎn)
function*
可以使用yield返回多次
調(diào)用方法使用next()執(zhí)行g(shù)enerator代碼,每次遇到y(tǒng)ield就返回一個(gè)對(duì)象{ value: x, done: true/false }, 如果done為true,則value就是return的返回值,沒(méi)有return就返回undefined,如果return語(yǔ)句后面還有yield,這個(gè)generator對(duì)象就全部執(zhí)行完成,不要再繼續(xù)調(diào)用next()了
直接用for ... of循環(huán)迭代generator對(duì)象,這種方式不需要我們自己判斷done
for (var x of fib(5)) { console.log(x); // 依次輸出0, 1, 1, 2, 3 }
如果給next方法傳參數(shù), 那么這個(gè)參數(shù)將會(huì)作為上一次yield語(yǔ)句的返回值
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請(qǐng)求; }co模塊 模塊思路
co 模塊的思路就是利用 generator 的這個(gè)特性,將異步操作跟在 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)點(diǎn)
內(nèi)置執(zhí)行器。 Generator 函數(shù)的執(zhí)行必須靠執(zhí)行器,所以才有了 co 函數(shù)庫(kù),而 async 函數(shù)自帶執(zhí)行器。也就是說(shuō),async 函數(shù)的執(zhí)行,與普通函數(shù)一模一樣,只要一行。
更好的語(yǔ)義。 async 和 await,比起星號(hào)和 yield,語(yǔ)義更清楚了。async 表示函數(shù)里有異步操作,await 表示緊跟在后面的表達(dá)式需要等待結(jié)果。
更廣的適用性。 co 函數(shù)庫(kù)約定,yield 命令后面只能是 Thunk 函數(shù)或 Promise 對(duì)象,而 async 函數(shù)的 await 命令后面,可以跟 Promise 對(duì)象和原始類型的值(數(shù)值、字符串和布爾值,但這時(shí)等同于同步操作)。
Express 和 Koa 的區(qū)別 Express優(yōu)點(diǎn):線性邏輯,通過(guò)中間件形式把業(yè)務(wù)邏輯細(xì)分、簡(jiǎn)化,一個(gè)請(qǐng)求進(jìn)來(lái)經(jīng)過(guò)一系列中間件處理后再響應(yīng)給用戶,清晰明了。
缺點(diǎn):基于 callback 組合業(yè)務(wù)邏輯,業(yè)務(wù)邏輯復(fù)雜時(shí)嵌套過(guò)多,異常捕獲困難。
優(yōu)點(diǎn):首先,借助 co 和 generator,很好地解決了異步流程控制和異常捕獲問(wèn)題。其次,Koa 把 Express 中內(nèi)置的 router、view 等功能都移除了,使得框架本身更輕量。
缺點(diǎn):社區(qū)相對(duì)較小。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/90119.html
摘要:調(diào)用棧被清空,消息隊(duì)列中并無(wú)任務(wù),線程停止,事件循環(huán)結(jié)束。不確定的時(shí)間點(diǎn)請(qǐng)求返回,將設(shè)定好的回調(diào)函數(shù)放入消息隊(duì)列。調(diào)用棧執(zhí)行完畢執(zhí)行消息隊(duì)列任務(wù)。請(qǐng)求并發(fā)回調(diào)函數(shù)執(zhí)行順序無(wú)法確定。 異步編程 JavaScript中異步編程問(wèn)題可以說(shuō)是基礎(chǔ)中的重點(diǎn),也是比較難理解的地方。首先要弄懂的是什么叫異步? 我們的代碼在執(zhí)行的時(shí)候是從上到下按順序執(zhí)行,一段代碼執(zhí)行了之后才會(huì)執(zhí)行下一段代碼,這種方式...
摘要:而在中是迭代器生成器,被創(chuàng)造性的拿來(lái)做異步流程控制了。當(dāng)執(zhí)行的時(shí)候,并不執(zhí)行函數(shù)體,而是返回一個(gè)迭代器。行代碼再看看文章開(kāi)頭的行代碼首先生成一個(gè)迭代器,然后執(zhí)行一遍,得到的是一個(gè)對(duì)象,里面再執(zhí)行。 廣告招人:阿里巴巴招前端,在這里你可以享受大公司的福利和技術(shù)體系,也有小團(tuán)隊(duì)的挑戰(zhàn)和成長(zhǎng)空間。聯(lián)系: qingguang.meiqg at alibaba-inc.com 首先請(qǐng)?jiān)徫业臉?biāo)題...
摘要:如果你還沒(méi)讀過(guò)上篇上篇和中篇并無(wú)依賴關(guān)系,您可以讀過(guò)本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個(gè)小時(shí)才完成這篇文章,篇幅較長(zhǎng),希望大家閱讀時(shí)多花點(diǎn)耐心,力求真正的掌握相關(guān)知識(shí)點(diǎn)。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就能獲得...
摘要:如果你還沒(méi)讀過(guò)上篇上篇和中篇并無(wú)依賴關(guān)系,您可以讀過(guò)本文之后再閱讀上篇,可戳面試篇寒冬求職季之你必須要懂的原生上小姐姐花了近百個(gè)小時(shí)才完成這篇文章,篇幅較長(zhǎng),希望大家閱讀時(shí)多花點(diǎn)耐心,力求真正的掌握相關(guān)知識(shí)點(diǎn)。 互聯(lián)網(wǎng)寒冬之際,各大公司都縮減了HC,甚至是采取了裁員措施,在這樣的大環(huán)境之下,想要獲得一份更好的工作,必然需要付出更多的努力。 一年前,也許你搞清楚閉包,this,原型鏈,就...
摘要:如果我們只有一個(gè)異步操作,用回調(diào)函數(shù)來(lái)處理是完全沒(méi)有任何問(wèn)題的。事件監(jiān)聽(tīng)使用事件監(jiān)聽(tīng)的方式番禺廣州上述代碼需要實(shí)現(xiàn)一個(gè)事件監(jiān)聽(tīng)器。只處理對(duì)象廣州番禺函數(shù)將函數(shù)的自動(dòng)執(zhí)行器,改在語(yǔ)言層面提供,不暴露給用戶。 概論 由于 JavaScript 是一門單線程執(zhí)行的語(yǔ)言,所以在我們處理耗時(shí)較長(zhǎng)的任務(wù)時(shí),異步編程就顯得尤為重要。js 處理異步操作最傳統(tǒng)的方式是回調(diào)函數(shù),基本上所有的異步操作都可以...
閱讀 3012·2021-11-22 12:06
閱讀 599·2021-09-03 10:29
閱讀 6526·2021-09-02 09:52
閱讀 2013·2019-08-30 15:52
閱讀 3411·2019-08-29 16:39
閱讀 1190·2019-08-29 15:35
閱讀 2061·2019-08-29 15:17
閱讀 1416·2019-08-29 11:17