2015-01-30 3 views
0

Я погружаюсь в генераторы javascript, и я действительно смущен.Генераторы Javascript ES6

Я использую [email protected] запустить этот пример:

function find() { 
    process.nextTick(function() { 
     it.next(1); 
    }); 
}; 

var it = (function* main() { 
    var k = yield find(); 

    console.log(k); 
})(); 

it.next(); 

Есть ли способ, чтобы захватить ссылку на next функции внутри генератора?

Что-то вроде:

function find(next) { 
    process.nextTick(function() { 
     next(1); 
    }); 
}; 

(function* main() { 
    var k = yield find(this.next); 

    console.log(k); 
})().next(); 
+1

Что вы на самом деле пытаетесь достичь, управляете потоком? – loganfsmyth

+0

Что-то в этом роде. Я не знаю, что именно, это моя первая игра. –

+0

Я имею в виду, что в вашем конкретном примере вы можете передать 'it.next.bind (it)', если вы объедините свои первый и второй примеры. Но, вероятно, лучшие ответы в зависимости от варианта использования. Но нет, генератор не может напрямую обращаться к своей функции «.next», не захватывая объект в области. – loganfsmyth

ответ

1

Чтобы ответить на ваш вопрос прямо, вы не можете, потому что this внутри функции генератора не экземпляр генератора, это контекст вызова функции. Вы можете сделать:

function find(next) { 
    process.nextTick(function() { 
     next(1); 
    }); 
}; 

var it = (function* main() { 
    var k = yield find(it.next.bind(it)); 

    console.log(k); 
})(); 

it.next(); 

, но это довольно сложно. Как правило, это было бы выполнено с помощью библиотеки сопрограммы, такой как co. Таким образом, вы получите yield обещание, и когда обещание будет разрешено, co вызовет .next со значением, которое обещало решить.

var co = require('co'); 

function find(){ 
    return new Promise(function(resolve){ 
     process.nextTick(function(){ 
      resolve(1); 
     }); 
    }); 
} 

co(function *(){ 
    var k = yield find(); 

    console.log(k); 
}); 
Смежные вопросы