2016-05-31 12 views
1

Start Ich habe zwei FunktionenAsynchron-Funktion aufrufen, ohne in Dart erwarten, wie ein roter Faden

callee() async { 
    // do something that takes some time 
} 

caller() async { 
    await callee(); 
} 

In diesem Szenario caller() wartet, bis callee() beendet. Ich will das nicht. Ich möchte caller(), um direkt nach dem Aufruf callee() abzuschließen. callee() kann abgeschlossen werden, wenn in der Zukunft, ist mir egal. Ich möchte es einfach wie einen Faden beginnen und dann vergessen.

Ist das möglich?

Antwort

3

auch Wenn Sie die callee Funktion aufrufen, ist es ein Future zurückgibt. Die await wartet dann darauf, dass diese Zukunft abgeschlossen wird. Wenn Sie nicht auf die Zukunft warten, wird es irgendwann fertig, aber Ihre caller Funktion wird nicht blockiert, wenn Sie darauf warten. So können Sie einfach tun:

caller() { 
    callee(); // Ignore returned Future (at your own peril). 
} 

Wenn Sie das tun, sollten Sie sich bewusst sein, was passiert, wenn callee mit einem Fehler fehlschlägt. Das würde die zurückgegebene Zukunft mit diesem Fehler abschließen, und wenn Sie nicht auf die Zukunft hören, wird dieser Fehler als "nicht abgefangen" betrachtet. Nicht erfasste Fehler werden von der aktuellen Zone behandelt, und das Standardverhalten verhält sich wie ein unübertroffener Fehler auf oberster Ebene, der Ihr Isolat möglicherweise umbringt.

Also, denken Sie daran, den Fehler zu behandeln.

Wenn callee kann nicht fehlschlagen, groß, du bist fertig (es sei denn, es scheitert sowieso, dann wirst du Spaß haben, das zu debuggen).

können Sie den Fehler behandeln lokal:

caller() { 
    callee().catchError((e, s) { 
    logErrorSomehow(e, s); 
    }); 
} 

oder Sie können eine Fehlerbehandlungszone installieren und Ihren Code in das auszuführen:

runZoned(() { 
    myProgram(); 
}, onError: logErrorSomehow); 

Siehe runZoned Funktion und es ist onError Parameter.

1

Sicher, einfach weglassen await. Auf diese Weise wird callee() sofort aufgerufen, und wenn eine asynchrone Operation aufgerufen wird, wird der Aufruf in der Ereigniswarteschlange zur späteren Ausführung geplant, und caller() wird unmittelbar danach fortgesetzt.

Dies ist jedoch nicht wie ein Thread. Wie bereits erwähnt, wird die Verarbeitung in die Ereigniswarteschlange eingereiht, was bedeutet, dass sie erst dann ausgeführt wird, wenn die aktuelle Aufgabe und alle zuvor in die Warteschlange eingereihten Aufgaben abgeschlossen sind.

Wenn Sie eine echte parallele Ausführung wünschen, müssen Sie Isolate verwenden.

Siehe