2016-03-27 8 views
0

Wenn ich einen benutzerdefinierten Generator erstellen, kann ich den Wert/fertig, wie ich es für richtig halte, aber ich glaube, dass ich hier falsch mit Es6-Generatoren gehen, wie ich nicht scheinen kann setze den Wert/done wie ich will. Wenn ich etwas gesetzt, es geht alles in den „Wert“, aber die Rückkehr des Generator „getan: false“ - Ich habe „getan: true“ zu zwingen, ich versucheGenerator und Einstellung Wert/auf den Ertrag

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}** 

aber es ergibt: {Wert : {done: true}, done: false}

Antwort

1

"Erzwingen done" würde von return durchgeführt werden. Wenn in einem Generator

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

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

uggg !! so einfach .. mein schlechtes fragen! lol ABER - was, wenn ich den Generator wieder starten möchte? Es scheint, sobald ein "fertig" zurückgegeben wird ... sind alle Wetten aus. –

+0

Keine Sorgen, glücklich zu helfen :) – loganfsmyth

+0

Ich fragte nur: Was, wenn ich den Generator wieder starten möchte, ich möchte nicht eine neue Instanz davon erstellen müssen .. –

1

Hier ist, was ich gefunden habe, um die Antwort zu erstellen, die Sie in Ihrem Code suchten.

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

ja - das ist gut, und was ich getan habe. Problem, das ich gefunden habe, ist, sobald du "wahr" zurückkehrst, wird der Generator tot. Ich möchte es wieder starten, ohne einen neuen Generator zu haben. –

+0

Sie möchten dasselbe Array mit demselben Generator erneut durchlaufen? –

+0

Ja, die Idee ist, dass es ein Stepper ist - es kann vorwärts oder rückwärts gehen (Übergang in den Generator) - ich denke, das geht gegen die "Essenz" eines Generators, aber es muss eine Nutzung jenseits lzy eval. –