我們寫乙個函式 在function後或前加* ,這個函式返回值就是generator,這個函式稱為generator函式
function
*main
()main
()// -> [object generator]
function
*learn
()let
learnge
=learn
()// ->
generator函式可以只執行函式的一部分,函式的剩餘部分可以有使用者控制繼續執行。
learnge.next() // ->
done 為false表示 learn函式未執行完畢
value 表示 learn函式 yield 1中的 1
再次呼叫next()會執行到下乙個 yield之處
learnge.next() // ->
learnge.next() // ->
最後執行之return之處 done為true ,value是return 的返回值
前面的介紹根本體現不了yield的強大之處,有乙個重點並沒有介紹,它就是:
可以給learnge.next函式傳遞引數 ,這個引數可以作為yield的返回值(注意:一定要動手實驗)
function
*withparam
()let
withparamge
=withparam
()letwr=
withparamge
.next
()withparamge
.next
("hello "+wr
.value
)// ->
由結果可知,給next傳遞引數可以控制"a"到變數a之間的轉換。
乙個很實用的地方,利用yield取出非同步的『返回值』,使generator函式看起來就像同步一樣。
假設我們有乙個http介面函式——http.get(url) -> promise json error 傳遞url返回promise
function
*mylogic
()function
runmypromise(ge
,val
)else
}runmypromise
(mylogic
())
runmypromise函式取出promise中的data,通過generator的特性賦值給 mylogic函式中的data,mylogic函式中的非同步呼叫看起來就像同步一樣簡單。不,可以說就是同步**了。
上面鋪墊了這麼多就是為了在這裡給yield賦能,通過yield關鍵字,我們可以控制yield後面的表示式和yield前面賦值的關係——簡單說就是控制怎樣賦值的,如前面yield promise是取出promise中的data去賦值。除了promise可能還想控制其它的賦值關係,我將它封裝到乙個函式中runiwant。
實現的功能如下
let a = yield promise json error -> 返回promise 中的json
let b = yield generator val -> 返回 generator中的val (注:這裡的val指的是generator函式的返回值)
let c = yield 其它 -> 返回其它本身
let d = yield nothing -> 直接退出執行 返回nothing
如果generator函式沒有遇到promise同步返回值,否則返回promise中的data
function
ispromise(a
)function
isgenerator(a
)const
nothing
=symbol
('nothing'
)const
tovalue
=symbol
('tovalue'
)function
istovalue(a
)function
runiwant(ge
,gval)if
(gval
.done
)elseif(
ispromise
(gval
.value)))
}elseif(
isgenerator
(gval
.value
))elseif(
gval
.value
===nothing
)else
}
(注:有些是手工輸入打去的並沒有經過測試,如果有錯誤請指出)
function
*getname
()function
*main
()
這些**可以直接在chrome repl中執行 無需babel
備註:promise json error 是指 psomise型別 then取出的型別json,catch取出的型別是error, 讚賞
科技為地產賦能
慷寶 conbcnirslow 智慧型管家機械人 創鏈科技等區塊鏈技術下的房產應用平台 以及雲銷售平台等多元創新業務重磅亮相 中國房地產行業發展三十餘年,到今天已經積累了數百萬億資產,數十萬個社群,資產規模空前,涉及千家萬戶。時至今日,房地產行業中人都在思考,行業發展的下一步路在何方?巨大的存量房市...
資料中颱為新型城市治理模式賦能
根據聯合國的 到2050年,全球城市人口總量將增加25億。其中,中國將新增人口2.55億。人口不斷膨脹,交通擁堵 環境惡化等各種文明病接踵而至。發展失衡在不斷透支城市的發展根基與後勁,同時也對傳統的城市治理與服務能力提出了新的要求。一座更好的城市,成為每個人的剛需。以人工智慧 大資料 雲計算為代表的...
一朵為員工賦能的「美」雲
所有偉大的企業最重要的還是組織和人,凡是偉大的企業都是把組織和人的活力激發到極限的企業。她說,我們要做乙個為員工賦能的雲服務解決方案,從員工的視角設計流程以及it系統,讓以人為本的理念真正地落地 她是美雲智數的慧享雲事業部總經理李豔平,具有美的20年的企業資訊化規劃和建設經驗。在大資料 網際網路等創...