2016-11-24 53 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