2017-04-20 4 views
0

docs zeigen, dass, um parallele Aufgaben ausführen können, wir tun so etwas wie diesesSagas - Verfolgung und Verarbeitung parallele Aufgaben

const [ a, b, c, ] = yield [ forkA, forkB, forkC ]

welche Strategien würden Sie vorschlagen, um den Status jeder dieser Aufgaben für den Umgang mit?

zum Beispiel:

a/c erfolgreich sind, haben X Aktion b nicht erfolgreich ist, y Aktion

tun dachte ich über actionChannels entlang der Linien von

const tasksStarted = yield actionChannel(start_task); const tasksCompleted = yield actionChannel(end_task);

Verwendung

Jede erledigte Aufgabe kann dann in ihren entsprechenden Behälter (X/Y) gestellt werden

Ich bin mir jedoch nicht sicher, ob dies übertrieben ist und wollte eine Plausibilitätsprüfung durchführen, wenn jemand ähnliche Probleme gelöst hat.

Um ein Gefühl der Skala zu geben, die oberen diese Reihe von Aufgaben sein kann, gebunden bis zu 20

ich dies auch in Redux-Saga Ausgaben geschrieben, aber da hier die Gemeinschaft groß ist, dachte ich, es Es wäre es wert, versuchen Sie beide ahem Kanäle.

+0

wird Ihr Status in irgendeiner Weise aktualisiert, wenn eine Aufgabe abgeschlossen ist? nur in Ihrem Zustand zu wissen, scheint der einfachste, offensichtlichste Weg – aw04

+0

da diese parallele, nicht blockierende Gabeln sind, kann ich nicht unbedingt auf sie auf der Linie nach mit Rendite setzen ({}). Ich könnte [callA, callB] geben, aber das gesamte Programm würde blockiert werden, bis sie alle abgeschlossen sind (was nicht wünschenswert ist) –

Antwort

0

Nun, Sie verwenden Sagas für die Ausführung einiger asynchroner Operationen, die Daten über den Status austauschen sollen. Die einfachste Option in der aktuellen Situation ist die Verwendung der Fork-Funktion() anstelle der automatischen Konstruktion, die alle Reduktionsaktionen erfasst. Allgemeine Informationen zum Gabelmodell finden Sie unter https://redux-saga.js.org/docs/advanced/ForkModel.html.

Wenn es nicht nur erforderlich ist, eine Menge der erwarteten Flüsse zu organisieren, sondern auch Verzweigungen abhängig von einem gegenseitigen Status zu machen, ist es möglich, einen Trick mit dem Schließen und dem "eingefrorenen" Versprechen zu verwenden.

function generateTrigger() { 
    let raiseSuccess = null, raiseFail = null; 
    let promise = new Promise((resolve, reject) => { 
    raiseSuccess = resolve; 
    raiseFail = reject; 
    }) 
    return { 
    raiseSuccess, 
    raiseFail, 
    promise 
    } 
} 

let trigger = generateTrigger(); 

function* task1() { 
    while(true) { 
    // Some code 
    if (isSuccess) { 
     trigger.raiseSuccess(); 
     trigger = generateTrigger(); 
    } else { 
     trigger.raiseFail(); 
     trigger = generateTrigger(); 
    } 
    // Some code 
    } 
} 

function* task2() { 
    while(true) { 
    // Some code 
    try { 
     yield call(() => trigger.promise); 
     // If task1 done with success 
    } catch (e) { 
     // If task1 done with fail 
    } 
    // Some code 
    } 
} 

function* main() { 
    try { 
    yield fork(task1) 
    yield fork(task2) 
    } catch (e) { 
    } 
} 
Verwandte Themen