blog icon indicating copy to clipboard operation
blog copied to clipboard

写给小盆友看的generator入门指南

Open fengzilong opened this issue 8 years ago • 2 comments

剧本

时间

地点

野外,有一排

每棵树上都长了一颗

观众:mmp,这是椰子树,你告诉我长了苹果?! 导演:我说是就是

出场人物

主角:👦🏻 你 配角:🐒 猴子

故事开始了

你看到了这排🌴,然后突然想吃树上的🍎,但你不会爬树啊

环绕四周一看,诶,远处有只猴子诶


你:猴子🐒,你能帮我把苹果摘下来么?

会说话的猴子:我为什么要帮你摘啊,你能给我什么?

你眉头一皱,挠了挠头

“我给你香蕉🍌可以么?”

会说话的猴子:成交了👌

function * G() {
    const bananas = []

    bananas[0] = yield 🍎

    try {
        bananas[1] = yield 🍏
    } catch( 💩 ) {}

    bananas[2] = yield 🍎

    bananas[3] = yield 🍏

    bananas[4] = yield 🍎
}
const gen =  G()

你:去吧,皮卡猴

gen.next()

猴子跳到了第一棵树上,摘了苹果🍎给你


你尝了尝,诶哟,好像不错哦

于是你扔了一个香蕉🍌给猴子作为报酬

你:去吧,到下一棵树去

gen.next( 🍌 )

这时候猴子跳到了下一棵树上,并扔了苹果🍏过来


你拿到后尝了尝

你:🤢

麻蛋,这苹果没熟啊,你非常生气😤,随手抄起一个不明物体💩扔向了猴子

gen.throw( 💩 ) // 我扔...

结果没想到猴子早有准备,他接住,哦不,挡住了这个不明物体

猴子白了你一眼,又跳到下一棵树上,又扔了苹果🍎给你,“再尝尝这个”


你尝了尝,这次好像熟了

你:这次的苹果不错,再去下一棵树上吧

但这时你摸了摸口袋,突然发现香蕉没了,尴尬😓

于是你打电话给你妈,让你妈带了香蕉过来(异步)

香蕉又有了,继续

gen.next( 🍌 )

猴子接住香蕉,跳到了下一棵树上,扔了个苹果🍏给你


诶???怎么又是生的,这次你又怒了

又抄起不明物体扔了过去,这次猴子没准备好(try...catch...),直接被你砸懵逼了

gen.throw( 💩 ) // 再扔...

猴子:我不干了!!!

你:...


你:继续嘛 猴子:不干

gen.next() // { done: true: value: undefined }

你:继续嘛 猴子:不干

gen.next() // { done: true: value: undefined }

小盆友们,看完之后你知道为什么generator在其他语言里面叫做协程了么?

🙄 🙄 🙄

fengzilong avatar Aug 18 '17 06:08 fengzilong

666

zhuping avatar Aug 18 '17 06:08 zhuping

跟着楼上,999

ReAlign avatar Aug 18 '17 06:08 ReAlign