Was ist der Unterschied zwischen Gabel und laichen in der redux-saga?

Den docs sagen Gabel ist eine befestigt Gabel und spawn ist ein freistehende Gabel – wie unterscheiden Sie sich?

  • Haben Sie Lesen Sie den rest der Seite?
InformationsquelleAutor PaulB | 2017-04-06



2 Replies
  1. 26

    Einen Weg, es zu betrachten ist zu sehen, dass Ihr saga als Diagramm. ‚Gabel‘ legt ein Kind aus dem aufrufenden Prozess. Beim ’spawn‘ erstellt ein neues Kind unter die Wurzel des Graphen.

    Also, wenn Sie ‚Gabel‘ ein weiterer Prozess, der Elternprozess wartet, bis die ‚Gabel‘ – Prozess abgeschlossen ist. Auch jede exception, wird die Blase vom Kind zu den Eltern und können gefangen werden, in der übergeordneten.

    Einen ‚hervorgebracht‘ Prozess, obwohl nicht blockiert die Muttergesellschaft, also der nächsten ‚yield‘ statement aufgerufen wird, sofort. Auch der parent-Prozess wird nicht in der Lage sein, um alle Ausnahmen abzufangen, die geschehen, in die „hervorgebracht“ – Prozess.

    Ich hoffe, das war hilfreich.

    • A 'spawned' process though will not block the parent Dies ist auch der Fall für forked-Prozesse, ist es nicht?
    • schauen Sie auch auf meine Antwort oben.
  2. 20

    In der gleichen docs heißt es:

    Wenn der Elternprozess beendet die Ausführung des eigenen Körpers von Anweisungen, wird es warten, bis alle Gabel-Aufgaben zu beenden, bevor er zurückkehrt.

    Sagen wir, wir haben dieses setup, wo in der Mitte der Ausführung flow wir nennen fetchAll() dass nennen könnte entweder fork oder spawn:

    const { delay, runSaga } = require("redux-saga");
    const fetch = require("node-fetch");
    const { fork, spawn, call, put} = require("redux-saga/effects");
    
    
    function* fetchResource(resource) {
        console.log(`Fetch ${resource} start`);
        const response = yield call(fetch, "https://jsonplaceholder.typicode.com" + resource);
        const text = yield call(response.text.bind(response));
        console.log(`Fetch ${resource} end`);
    }
    
    function* fetchAll() {
        console.log("Fork or Spawn start");
        //this is pseudo code, I mean here that you can use either
        //fork or spawn, check results below
        const task1 = yield fork||spawn(fetchResource, "/posts/1"); 
        const task2 = yield fork||spawn(fetchResource, "/posts/2");
        console.log("Fork or Spawn end");
    }
    
    function* main() {
        console.log("Main start");
        yield call(fetchAll);
        console.log("Main end");
    }
    
    runSaga({}, main);
    
    //RESULTS WITH FORK():   |  RESULTS WITH SPAWN():
    //                       |
    //Main start             |  Main start
    //Fork start             |  Spawn start
    //Fetch /posts/1 start   |  Fetch /posts/1 start
    //Fetch /posts/2 start   |  Fetch /posts/2 start
    //Fork end               |  Spawn end
    //Fetch /posts/2 end     |  Main end <-- 
    //Fetch /posts/1 end     |  Fetch /posts/2 end
    //Main end <--           |  Fetch /posts/1 end

    Was wir sehen, ist, innerhalb call Kontext der Gabel ist non-blocking, aber call ist nicht zu beenden, bevor alle untergeordneten Prozesse abgeschlossen sind, da call selbst eine blockierende Wirkung.

    Würden Sie nicht das gleiche sehen wenn Sie anrufen ein fork innerhalb einer anderen fork, da die Gabel selbst ist nicht blockiert, und die innere Gabel-Prozesse würden leak aus der äußeren Gabel-Prozesse, werden aber gehalten, innerhalb der nächsten Sperrung Kontext. Dies ist die Essenz der attachment to parent.

    Also Eltern yield call(forkedProcess) wird von einer Blockierung der Natur erwarten, die für return oder throw resolution des Kindes Gabel Prozesse.

    Dies ist nicht der Fall mit spawn() aber da spawn ist, losgelöst von der umgebenden übergeordneten Prozess, also an der Wurzel-Prozess, damit lokale parent muss nicht warten.

    Hoffe, das klärt es ein bisschen.

    • Dies ist sehr nützlich, danke! Tut put auch arbeiten wie fork? In der parent wartet, bis die gesetzt ist, getan, und so nach jedem yield put die nächsten yield select ist garantiert, geben die put ‚ ed Wert aus speichern?
    • und select delegieren der Kontrolle zu redux zum abschließen der Aktion, so hängt es von der middleware-stack haben Sie auf redux Seite, wenn es keine async-Schichten beim Versand einer Aktion, dann setzen Sie auf den richtigen Rückzug des Staates mit select nach put. Aber die select-und die stellen sollten in den gleichen Prozess, wenn Gabel, sonst select und put bekommen kann desynced durch unterschiedliche Wege auf, wie Sie geplant sind innerhalb redux-saga. Überprüfen Sie in diesem Beispiel
    • Vielen Dank Grigoryan für die gemeinsame Nutzung dieser info-und so viel für das Beispiel! Ich habe nichts, aber redux-saga installiert, so bedeutet dieses, habe ich nichts in der asynchronen Ebenen der Versand?
    • wenn Sie keine benutzerdefinierten middleware und einfach redux und redux-saga, und unter Berücksichtigung der in Beispiel Verhalten, dann definitiv JA : )

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.