JavaScript中的生成器在功能上是否与其他语言中的协同程序等效?

时间:2015-08-07 10:02:21

标签: javascript generator ecmascript-6 coroutine

在ECMAScript 6中,有一个被称为" generators"的功能被实现。

"发电机"似乎在功能上等同于" coroutines"来自其他编程语言。 JavaScript甚至在这些生成器中使用相同的关键字,如yield

如果它们的功能完全相同,或者至少在它们背后有相同的概念,为什么它们被称为"发生器"在JavaScript和"协同程序"在其他人?

我能想到为什么会这样做的唯一可能原因是因为生成器在功能上有所不同,因此他们给了它一个不同的名称,但在审查了一些代码后,我不太确定....

这里有两个在Python和JavaScript中使用协同程序/生成器的函数,只是为了比较。

(来自Python文档中的Tasks and coroutines

import asyncio
import datetime

@asyncio.coroutine
def display_date(loop):
    end_time = loop.time() + 5.0
    while True:
        print(datetime.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break
        yield from asyncio.sleep(1)

loop = asyncio.get_event_loop()
# Blocking call which returns when the display_date() coroutine is done
loop.run_until_complete(display_date(loop))
loop.close()

(来自MDN文档中的Iterators and generators

function* idMaker(){
  var index = 0;
  while(true)
    yield index++;
}

var gen = idMaker();

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2

我想补充一点,我的编程知识并没有超出JavaScript。

我已经坚持使用JavaScript 4年多了。也许这是我所知的差距,这就是我在这里问的原因。

0 个答案:

没有答案