文章同步自個人部落格:此前只是簡單使用而沒有真正的去研究 generator,這次要好好折騰下這貨。
對於 jser 來說,非同步非常熟悉了吧,但是真正理解非同步的卻不多,因為大部分人只知道**。
隨著js的快速發展,非同步方案也層出不窮,從最開始的**到promise,再到generator,然後到async/await。
甚至有人說 async/await 是非同步的終極解決方案,我不敢直接贊同,只能說是目前最好的非同步體驗。
本篇先從 generator 講起,後序再詳細說 async/await。
從最最經典的 ajax 請求開始今天的話題吧。
假如,我們要依次請求 url1, url2, url3 這3個位址。
$.get('url1', function(r1) );
});});
一不小心就寫成這樣了。
如果你是 jquery 粉的話,你可能會說也可以這樣實現啊。
$.get('url1').then(function(r1) ).then(function(r2) ).then(function(r3) );
用 jquery 的 deferred 物件,類似 promise 來規避**地獄,看著確實平了,但體驗並不是特別友好。
generator 的基礎這裡就不展開說了,直接說應用。
function* gen()
這是比較友好的非同步方式,但是還有個至關重要的因素,怎麼執行這個 generator 是個問題。
直接手動g.next()
執行那肯定不行,鬼知道有多少個 yield。
我們要實現乙個啟動器來執行它,並把 promise 結果傳給下一次next,這樣就實現了 yield 接收值的功能。
先來實現乙個最簡陋的起動器。
function run(gen) ); // 這個是關鍵,把值傳回傳
} next();
}
然後我們只要一行**。
run(gen);
generator 就啟動起來了,並且一直執行到 done 為 true 為止。
開啟 動漫網。非廣告,確實沒找到合適的測試站,湊合下吧。
然後把下面**貼到控制台,看下結果。如果執行不了,請公升級瀏覽器,本例在 chrome 51 下通過。
function* gen()
function run(gen) ); // 這個是關鍵,把值傳回傳
} next();
}run(gen);
可能你已經發現了,其實這就是 co 的原理,但 co 比這個例子嚴謹多了,而且api設計的也非常友好。
本篇到此也就結束了,利用 generator 的 yield 功能實現引數回傳,讓**看起來非常『同步』,讓非同步體驗變的更加友好。
讓apach 開機自啟動
在linux 原始碼編譯安裝了apache 服務 apache 服務啟動命令 usr local apache bin apachectl start 或是把apachectl 軟鏈結或cp到 sbin目錄下 apachectl start 用chkconfig 工具讓apache服務執行在執行級別...
linux設定自啟動,mongodb自啟動
linux建立自啟動指令碼 1 進入目錄 cd etc init.d 複製 2 建立指令碼檔案 touch start mongodb.sh 複製 3 編寫指令碼 bin sh chkconfig 345 99 10 description auto starts mongodb echo star...
windows下讓SVN服務開機自啟動
例 我的svn服務端軟體裝在d program fiels subversion下,版本庫在e svn repository下 接下來使用命令建立服務 sc create svn binpath d program files subversion bin svnserve.exe service ...