发电机和babel节点

时间:2015-07-04 21:39:08

标签: javascript generator ecmascript-6 yield babeljs

不确定使用Babel是否是我的ES6缺乏经验,但是我试图创建一种异步的if ... then

block ::=   
    block_statement
|   block_statement block
;
block_statement ::=
    type variable_declarators SEMICOLON
|   statement
;
statement ::=   sub_statement
|   IF LPAREN boolexp RPAREN statement FI
|   IF LPAREN boolexp RPAREN statement ELSE statement FI
|   WHILE LPAREN boolexp RPAREN statement ELIHW
|   FOR LPAREN assignment SEMICOLON boolexp SEMICOLON
        statement_expression RPAREN statement ROF
;
sub_statement ::=
    statement_expression SEMICOLON
|   RETURN Exp SEMICOLON
|   block
;
statement_expression ::=
    assignment
|   IDENTIFIER LPAREN argument_list RPAREN
|   IDENTIFIER PLUSPLUS
|   IDENTIFIER MINUSMINUS
;

然后我用

从其文件中运行
var token = 6;

var f1 = function*() {
    if (token > 5) {
        getToken();
        token = yield;
    }
    console.log(token);
};

var getToken  = function() {
    for (i=0; i<10000000; i++) {
        var x = i*2;
    }
    f1(0);
};

f1();

我期待babel-node generator.es6.js ,但我根本没有得到任何东西。

1 个答案:

答案 0 :(得分:1)

您需要调用生成器函数来创建生成器,然后使用.next()调用来推进它:

function* f() {
    var token = 6;
    if (token > 5) {
        getToken();
        token = yield;
    }
    console.log(token);
};

function getToken() {
    setTimeout(function() {
        f1.next(0); // advance generator
    }, 100);
};

var f1 = f(); // create generator
f1.next(); // start generator

请注意,推进生成器必须异步完成,直接从getToken调用它会导致TypeError来自f1.next()f1仍在执行。它需要首先到达yield语句。