.json()
асинхронный?
Да. Вот почему он возвращает обещание.
Этот метод асинхронен, чтобы избежать блокировки при чтении больших входящих потоков данных?
Да. Вы получаете Response
сразу после прибытия заголовков, и получение тела может занять некоторое время.
Разве что-то вроде setTimeout(sampleStream, 0)
несколько раз, пока не будет найден конец потока?
Не совсем. Он не использует setTimeout
, он читает из потока, повторяя получение обещаний для следующего фрагмента - просто проверьте около reading all bytes from a ReadableStream.
И самое главное, все это происходит в фоновом задании без каких-либо проблем для JavaScript. Как отмечается в этом разделе: Поскольку читатель предоставляет эксклюзивный доступ, фактический механизм чтения не может быть соблюден. Реализации могут использовать более прямой механизм, если это удобно.
Btw, 'Promise' выполняет микрозадания, что означает, что каждое обращение их обратных вызовов добавляется к текущей итерации цикла событий. Это может привести к поведению блокировки (например, при использовании рекурсии). С другой стороны, обратный вызов setTimeout' выполняется в следующей итерации цикла событий. – ftor
Является ли микрозадание четко определенной концепцией? – Ben
Yep [Разница между микрозадачей и макрозадачей в контексте цикла событий] (http://stackoverflow.com/q/25915634/6445533) – ftor