Synchronität in RxJS
Ich würde erwarten, dass der folgende code asynchron ausführen:
var range = Rx.Observable.range(0, 3000000);
range.subscribe(
function(x) {},
function(err) {},
function() {
console.log('Completed');
});
console.log('Hello World');
Aber das ist nicht der Fall. Es dauert eine Weile, um durch zu gehen die große Reihe von zahlen und nur, wenn es fertig ist die Ausführung wieder aufgenommen wird, können Sie versuchen, den code hier.
Ich bin verwirrt, wenn zu erwarten RxJS zu Verhalten, synchron oder asynchron. Kommt es auf die verwendete Methode? Meine bisherige Idee war, dass einmal wir sind in physikalischen Grössen/Observer-land, alles wird asynchron ausgeführt, ähnlich wie bei der Arbeit verspricht.
- Events und callbacks sind nicht notwendigerweise asynchron. In der Tat, die meisten von DOM-Ereignissen synchron sind, außer für das laden und entladen. Wenn Sie das Feuer ein DOM event-synthetisch, ist der Listener synchron aufgerufen
Du musst angemeldet sein, um einen Kommentar abzugeben.
RxJs folgt den gleichen Regeln wie Rx.Net. Standardmäßig wird jede observable operator verwendet, der minimale Betrag der Asynchronität benötigt, um seine Arbeit zu tun. In diesem Fall
Range
ausführen können durch die Nummern synchron und so ist es nicht (die Dokumentation sagt Ihnen, es wird dieRx.Scheduler.currentThread
standardmäßig.Wenn Sie wollen, um die Einführung von mehr Asynchronität als notwendig für einen Betrieb, müssen Sie sagen, eine andere Scheduler.
Um das Verhalten, das Sie erwartet hatten, das Sie verwenden möchten
Rx.Scheduler.timeout
. Dieser wird, im wesentlichen, weil es zu planen, in jeder iteration übersetTimeout
. (In Wirklichkeit ist dies nicht einfach, den scheduler verwenden die Schnellste Methode zur Verfügung, die im browser zu planen aufgeschobene arbeiten).aktualisiert jsFiddle
Beachten Sie, dass die Iteration über 3 Millionen zahlen über
setTimeout
nehmen fast ewig. Also vielleicht sollten wir verarbeiten Sie in Chargen von 1.000. So, hier nutzen wir das Standard-Verhalten vonRange
zu laufen synchron, dann batch die Werte und verwenden SieobserveOn
zum ausführen des batches über unsere scheduler-timeout:jsFiddle Beachten Sie, dass es eine Verzögerung am Anfang, während
range
Kurbeln durch alle 3,000,000 Werte undbufferWithCount
produziert die 3.000-arrays. Dieses Zeug ist ungewöhnlich für echte Produktions-code, in dem Sie Ihre Datenquelle ist nicht so trivial, wieObservable.range
.FYI Versprechungen sind nicht anders in dieser Hinsicht. Wenn Sie anrufen
then
auf ein Versprechen, das bereits abgeschlossen ist, dassthen
- Funktion kann synchron laufen. Alle Versprechungen und Observablen wirklich vorhanden ist eine Schnittstelle können Sie durch die Bereitstellung von Rückrufen an, die garantiert ausgeführt, wenn die Bedingung erfüllt ist, ob die Bedingung bereits erfüllt ist oder erfüllt wird später. RxJs bietet dann viele, viele Mechanismen zu zwingen, etwas zu werden, werden asynchron ausgeführt, wenn Sie wirklich wollen es auf diese Weise. Und Methoden einzuführen, mit bestimmten timings.