2016-11-24 54 views
0

我在JavaScript中第一次使用生成器函数并运行一些有趣的问题。console.log不从生成器函数调用

代码:

import moment from 'moment'; 

export default function recur(quantity, units) { 
    console.log('TESTING 1'); 

    function* recurGenerator(startDate, maxDate) { 
    console.log('TESTING 2'); 

    if (maxDate === undefined) { 
     this.throw('Argument maxDate is undefined'); 
    } 

    let nextDate = moment(startDate).clone(); 
    maxDate = moment(maxDate); 

    for (;;) { 
     nextDate = moment(nextDate).clone().add(quantity, units); 
     if (nextDate.isAfter(maxDate)) yield null; 
     yield nextDate; 
    } 
    } 

    return recurGenerator; 
} 

“测试2” 的console.log不会被调用。如果我不将maxDate传递给生成器函数,它也不会引发错误。这一定是关于我错过的发电机的事情。

编辑以显示用法

recur(1, 'day')(moment()) 

看来,被称为未来的需求第一屈服之前运行的代码?

+0

在哪里使用该发生器的代码? – JJJ

回答

2

在发电机的功能,第一yield语句之前的代码被执行不早于发电机进行到这一点:

let a = function *() { 
    console.log(1); 
    yield 2; 
    yield 3; 
} 

let b = a(); // no console output! 
let c = b.next(); // prints 1 to the console 
c // { value: 2, done: false } 
+0

我认为这是问题。接下来需要在返回的生成器对象上调用以在第一个yield之前运行代码? – Kylee

+1

是的,下一个必须被调用来执行下一个yield语句。在此之前,您可能会认为发生器在功能的零线“暂停”。 – SVSchmidt