讓 Generator 自啟動

2022-01-17 22:28:10 字數 1485 閱讀 4830

文章同步自個人部落格:

此前只是簡單使用而沒有真正的去研究 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 ...