Асинхронные c итераторы и генераторы: потоковая передача GeoJSONL - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь воспроизвести код Бретта Кампера о потоковой передаче файлов GeoJSONL, и это довольно сложно.

Я пытаюсь понять, что он делает, шаг за шагом, но я действительно не могу понять, что делает этот синтаксис:

streamGeoJSONL = async ƒ*(url)

Кто-нибудь может объяснить мне это? Если возможно, я хотел бы найти что-нибудь об этом в веб-документах Mozilla .

Кроме того, если бы кто-нибудь мог объяснить мне поток кода в данном примере, я был бы ДЕЙСТВИТЕЛЬНО признателен!

Спасибо!

1 Ответ

1 голос
/ 27 мая 2020

Всякий раз, когда вы видите синтаксис async function*, это означает, что это функция AsyncGenerator . Вы можете использовать AsyncGenerator, используя для await ... of на его сгенерированном AsyncIterator

async function* streamGeoJSONL(url) {...} // AsyncGenerator

const url = "https://s3.amazonaws.com/vtiles/honolulu_hawaii.geojsonl"

streamGeoJSONL(url) // => AsyncIterator

. Вы получаете AsyncIterator при вызове AsyncGenerator. Вот что генерирует AsyncGenerator: AsyncIterator

Вы можете использовать AsyncIterator с for await...of

for await (const newFeatures of streamGeoJSONL(url)) {/* do stuff with newFeatures */}

В случае вашего примера newFeatures берет на себя значение, отправленное обратно ключевым словом yield в streamGeoJSONL

async function* streamGeoJSONL(url) {
  // ...
  yield lines.map(JSON.parse) // this is newFeatures
} // AsyncGenerator
...