Вы правы, что тело получает во время извлечения (и что тело является потоком), но согласно спецификациям, когда браузер должен потреблять тело , оно должен прочитать все байты из этого потока с помощью потокового считывателя до он может " [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 ) )
, фактически вы выполняете точно такие же операции.