2016-03-27 12 views
0

私がカスタムジェネレータを作成すると、私はフィットと見えるように値を設定することができますが、私はここで間違っていると思います。私が望むように/ doneを設定してください。私は何かを設定すると、それはすべて、「値」になりますが、発電機の復帰は「行わ:偽」 - 私は「完了:true」を強制しようとしています発電機と設定値/降伏時に実行

var A = [ 
    {id: 1, page: 'page one'}, 
    {id: 2, page: 'page two'}, 
    {id: 3, page: 'page three'}, 
    {id: 4, page: 'page four'}, 
    ] 
function* gen(iteree) { 
    let input = yield null 
    while(true) 
     input = yield iteree(input) ? iteree(input) : { done: true} 
} 

// this will be built out more, just showing a 
// passing of a function here 
let inter = (a) => { 
     return A[a] 
} 

let c = gen(inter) 
    console.log(c.next()) 
    console.log(c.next(4)) // <-- **I want this to yield {value: null, done: true}** 

それが得られます。{値を:{done:true}、done:false}

答えて

1

"Forcing done"はreturnで実行されます。生成機内の場合

yield 4; 
// {value: 4, done: false} 

return 4; 
// {value: 4, done: true} 
+0

uggg !!とても簡単です。尋ねるのが悪いです!爆笑 - 私は再び発電機を起動したいのですが?それは、一度 "完了"が返されたようだ...すべての賭けはオフです。 –

+0

心配しないで、喜んで助けてください:) – loganfsmyth

+0

私は尋ねました:もし私が発電機をもう一度始動したいのであれば、私はそれの新しいインスタンスを作る必要はありません。 –

1

ここで私があなたのコード内で探していた答えを作成しています。

var A = [ 
    {id: 1, page: 'page one'}, 
    {id: 2, page: 'page two'}, 
    {id: 3, page: 'page three'}, 
    {id: 4, page: 'page four'}, 
    ] 
function* gen(iteree) { 
    let input = yield null 
    while(input <= A.length) { 
     if(iteree(input)){ 
     yield iteree(input) 
     }else{ 
     return null; 
     } 
    } 
} 

// this will be built out more, just showing a 
// passing of a function here 
let inter = (a) => { 
     return A[a] 
} 

let c = gen(inter) 
console.log(c.next()) 
console.log(c.next(4)) 
+0

ええ - これはいいですし、私は何をやってしまったのですか?私が見つけた問題は、ジェネレータが死んでしまう「真」を返すことです。新しいジェネレータを生成することなく、もう一度起動したいと思います。 –

+0

同じジェネレーターで同じ配列を繰り返し反復したいですか? –

+0

ええ、アイデアはステッパーです - それは前進または後退(ジェネレーターに渡すことができます) - ジェネレーターの "エッセンス"に反していると思いますが、それはlzy evalを超えた使用法でなければなりません。 –

関連する問題