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