Является ли `Body. json ()` быстрее, чем `JSON .parse (responseText)` для JSON, полученного из `fetch`? - PullRequest
7 голосов
/ 28 марта 2020

Является Тело. json () быстрее, чем JSON .parse (responseText) для JSON получено от fetch ?

Теоретически Body.json() может начать декодирование JSON, как только он получит первые байты от ReadableStream от fetch. Это как это работает? Или он ожидает получения всех байтов?

const response = await fetch(url);
const json = await response.json();
const response = await fetch(url);
const text = await response.text();
const json = JSON.parse(text);

Итак, есть ли разница между этими версиями кода?

1 Ответ

5 голосов
/ 30 марта 2020

Вы правы, что тело получает во время извлечения (и что тело является потоком), но согласно спецификациям, когда браузер должен потреблять тело , оно должен прочитать все байты из этого потока с помощью потокового считывателя до он может " [r] отменить результат преобразования обещания обработчиком выполнения, который возвращает результат алгоритма данных пакета".

Это означает, что прежде чем Body.json() сможет даже вызвать свой первый шаг utf-8-decode , полное тело должно быть уже прочитано как Uint8Array, и это же относится ко всем типам данных пакета .

. Тогда мы можем заключить, что

fetch( url )
  .then( body => body.json() );

на самом деле syntacti c сахар для

fetch( url )
  .then( body => body.arrayBuffer() )
  .then( bytes => new TextDecoder().decode( bytes ) )
  .then( text => JSON.parse( text ) );

и что

fetch( url )
  .then( body => body.text() );

сам по себе syntacti c сахар для

fetch( url )
  .then( body => body.arrayBuffer() )
  .then( bytes => new TextDecoder().decode( bytes ) )

И, таким образом, если вы добавите себя .then( text => JSON.parse( text ) ), фактически вы выполняете точно такие же операции.

...