為js中yield賦能

2021-08-16 04:00:22 字數 2648 閱讀 1526

我們寫乙個函式 在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年的企業資訊化規劃和建設經驗。在大資料 網際網路等創...