2015-03-31 3 views
1

Как создать генератор-производитель, который получает значения извне с другим генератором? Если producer дает значение внутри генератора, то он работает, но когда я отправляю значение с next, я получаю undefined. Есть ли способ сделать это?Создание генератора-генератора значений

function* producer() { 
    while (true) { 
     yield // want to send values here 
    } 
} 

function* take(n, gen) { 
    var i = 0 
    for (var x of gen) { 
     if (i <= n) { 
      yield x // want the value sent to the producer 
      i += 1 
     } else { 
      break 
     } 
    } 
} 

var prod = producer() 
var res = take(5, prod) 

// How can I send values to the producer 
// and make the result yield those values? 

res.next() // init 
console.log(res.next(1)) // {value: undefined, done: false} 
console.log(res.next(2)) // {value: undefined, done: false} 
// ... 

// I want to get 
// {value: 1, done: false} 
// {value: 2, done: false} 
// ... 
+0

Я не реально получить, что вы хотите. Вы ожидаете, что 'prod.next' будет функцией идентификации, и хотите« вызвать »это из' take'? – Bergi

+0

Производитель не должен потреблять значения. Почему вы пытаетесь отправить значения? – Bergi

ответ

1

Чтобы получить значение, которое посылается next(), вы должны использовать результат, возвращаемый выходом. Я не совсем уверен, что ваша конечная цель, но вот ваш модифицированный пример:

let producer = function*() { 
    var nextResult = undefined; 
    while(true) { 
     nextResult = yield nextResult; 
     console.log("produce " + nextResult); 
    } 
} 

let take = function*(number, items) {   
    var count = 0; 
    var item = undefined; 
    while (count <= number) { 
     items.next(item); 
     item = yield item; 
     console.log("take " + item); 
     count += 1; 
    } 
} 

var res = take(2, producer()) 

res.next() // init 
console.log('result ' + res.next(3).value) 
console.log('result ' + res.next(2).value) 

Это выходы:

take 3 
produce 3 
result 3 
take 2 
produce 2 
result 2 

ES6 fiddle link

Смежные вопросы