2017-12-31 116 views
0

Nachdem ich gerade von Thunks zu Sagas bewegt habe, versuche ich den besten Weg zu finden setTimeout und dann von innerhalb dieser Funktion rufen Sie eine andere Funktion (in diesem Fall corewar.step()). Dies war mein ursprünglicher Code, der so funktioniert, wie ich es erwarten würde.Verwenden von Redux-Saga mit setInterval - Wie und wann zu

runner = window.setInterval(() => { 

    for(let i = 0; i < processRate; i++) { 
     corewar.step() 
    } 

    operations += processRate; 

    }, 1000/60) 

Dieser Code ist in einem saga und ich glaube, dass ich in der Lage sein sollte, Funktionsaufrufe innerhalb call zu wickeln, wie ich in anderen Bereichen in der Anwendung getan habe.

Ich habe versucht, die setInterval Anruf in eine call und alles andere wie es ist, was in step() nie aufgerufen wird.

runner = yield call(window.setInterval,() => { 

    for(let i = 0; i < processRate; i++) { 
     corewar.step() 
    } 

    operations += processRate; 

    }, 1000/60) 

Ich habe versucht, die setInterval verlassen, da sie die step() Funktion in einem Aufruf und Ändern der anonymen Funktion Signatur function* die auch Ergebnisse in step() nie genannt wird, ist und Verpackung.

runner = window.setInterval(function*() { 

    for(let i = 0; i < processRate; i++) { 
     yield call([corewar, corewar.step]) 
    } 

    operations += processRate; 

    }, 1000/60) 

Schließlich Ich habe beide versucht, Einwickeln, die wiederum in step() führt nie aufgerufen wird.

runner = yield call(window.setInterval, function*() { 

    for(let i = 0; i < processRate; i++) { 
     yield call([corewar, corewar.step]) 
    } 

    operations += processRate; 

    }, 1000/60) 

Es fühlt sich an wie ich etwas fehlt bin hier so meine Frage ist, sollte ich brauche diese Funktionen einpacken in call überhaupt oder ist das falsch?

Die Folge auf Frage, ob ich sein, um die äußere setInterval in einem call würde wickeln werde soll, wie soll ich eine Funktion als Parameter an call werden definiert, die entweder eine Ausbeute will auch put oder call selbst?

Antwort

1
const anotherSaga = function *() { 
    const runner = yield call(setInterval,() => { 
    console.log('yes'); 
    }, 1000); 
    console.log(runner); 
} 

Das funktioniert ganz gut für mich. In Ihrem zweiten Snippet gibt es eine doppelte ) am Ende, wo nur eins sein sollte.

+0

Hmm, du hast recht Ich muss eine seltsame Kombination von Versuchen gehabt haben, Generatoren als CB-Parameter zu verwenden (die zusätzliche Klammer war nur ein Tippfehler, entfernt von q) – dougajmcdonald

Verwandte Themen