Ist .json()
asynchron?
Ja. Deshalb gibt es ein Versprechen.
Ist diese Methode asynchron, um Blockierungen beim Lesen großer eingehender Datenströme zu vermeiden?
Ja. Sie erhalten die Response
direkt nach dem Eintreffen der Header, und das Empfangen des Körpers kann einige Zeit dauern.
Tut es so etwas wie setTimeout(sampleStream, 0)
wiederholt, bis das Ende des Streams gefunden wird?
Nicht genau. Es verwendet nicht setTimeout
, liest es aus dem Stream durch wiederholbar Versprechungen für den nächsten Brocken bekommen - einfach über reading all bytes from a ReadableStream selbst überprüfen.
Und vor allem geschieht dies alles auf einer Hintergrundaufgabe ohne Bedenken für JavaScript. Wie die Notiz in diesem Abschnitt sagt: Weil der Leser exklusiven Zugriff gewährt, kann der tatsächliche Mechanismus des Lesens nicht beobachtet werden. Implementierungen könnten einen direkteren Mechanismus verwenden, wenn dies praktisch ist.
Btw, 'Promise' führen Mikroaufgaben aus, dh jeder Aufruf ihrer Rückrufe wird an die aktuelle Iteration der Ereignisschleife angehängt. Dies kann zu einem Blockierungsverhalten führen (z. B. wenn eine Rekursion involviert ist). Der 'setTimeout'-Rückruf wird andererseits innerhalb der nächsten Iteration der Ereignisschleife ausgeführt. – ftor
Ist Mikro-Task ein gut definiertes Konzept? – Ben
Yep [Unterschied zwischen Mikrotask und Makrotask innerhalb eines Ereignisschleifenkontexts] (http://stackoverflow.com/q/25915634/6445533) – ftor