EntidenDid Asyncイテレータ


Hは、テンポテンポATRum post em meu媒体onde falo tudo sobre o protocoloイテレータe suaインタフェースデuso.Por Les m , al Le m Apis comoPromise.finally , E ecmascript 2018トラックスパラシュートをかけてください.OSasync iterators .

問題点
vamos nos colocar em umaの状況Estamos Trabalhando COMノード.JS Eテトスque lerアルArquivo、リンハa linha.ノードPossuiさんのAPIのAPIエステtipoデ楽しいreadLine ( Vejaドキュメントを完成させるaqui ), エスタAPIは、UKラッパーPer que vocを見つけますpossaラーdadosデ馬ストリームデentrada linhaは、linha ao inv es s de ter - fafazer o構文解析をすることです.
Ea EXPは、e e uma - apiデEventos、que vocがpode escutar desta formaである
const fs = require('fs')
const readline = require('readline')
const reader = readline.createInterface({
  input: fs.createReadStream('./arquivo.txt'),
  crlfDelay: Infinity
})

reader.on('line', (line) => console.log(line))
イマジン・ティック・ハモ
linha 1
linha 2
linha 3
seロダルモスエステcは、digoのarquivo que criamos、teremosアム出力linha a linhaのnossoコンソールをします.Por Les M , Traalhar com Eventos n Tune as a uma das melhores formes de fazer c - diu manuten no vel , vis onntos s o o a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a Loos

ソルヌ哀歌
アルAPI da APIデEventos、oreadline タンブエムエクゼasync iterator . イライソの意味,イデオロギーに関する一考察line , Vamos Fazer A Litura da linha atrav es ' de uma nova forma de Utilizafor .
<論文>中世後期における遊戯者の行為for , Primeira delas et Modelo mais comum , Aurzzando um Contacor e Ma Condise
for (let x = 0; x < array.length; x++) {
  // Código aqui
}
ノータ・センター・オブ・Oのポモドス活用for … in <研究ノート>リトゥーラ・デ・ド・ディ・ディ・アレイ
const a = [1,2,3,4,5,6]

for (let index in a) {
  console.log(a[index])
}
いいえCoco前部、Vamosターcomo saconsole.log , s n meros de 1 a a 6 , por e m se zolzarmosconsole.log(index) vamos logar o sed nndice do配列、ou seja、os n - origin - meros de 0 a 5.
パラオ・カノ、ポモーオス・サウルfor … of 所有権としてのPegal Diretamente : Vis do Array , Ou Seja , Seus valores diretos :
const a = [1,2,3,4,5,6]

for (let item of a) {
  console.log(item)
}
<研究ノート>ペルシャ・タウダにおける「存在」としての「ペルー」イマームのTheHamosのUMA outraインターフェイスque nos retorne sempre umaの約束、que seの解決のパラシュートのa nossa linhaはarquivo emの探索を行うo . paraのResolvermos Esasはem ordem,temos de fazer algo assimを約束する
async function readLine (files) {
  for (const file of files) {
    const line = await readFile(file) // Imagine que readFile é o nosso cursor
    console.log(line)
  }
}
POSIO . M , GRA SPEC MAGIA DOS async iterables ( como o )readline ) <研究ノート>ペデインス・ファザイ・セゲンテ
const fs = require('fs')
const readline = require('readline')
const reader = readline.createInterface({
  input: fs.createReadStream('./xpto.txt'),
  crlfDelay: Infinity
})

async function read () {
  for await (const line of reader) {
    console.log(line)
  }
}

read()
Perceba queアゴラEstamos USADOオーナノヴァDefinifor , o for await (const x of y) .

を待つ.js
能田勢for await ランタイムを行うノード.sが10であるdaは、10 .X . se Vocは、estとしてUSEAN - AUTOを攻撃します.X OU 9x ent ent o o vocは、前のiniciar o seu arquivo JavaScript com A旗です--harmony_async_iteration . Innozmente OS AsyncIterator n ' s o s s o o suportados NAS Ver . es 6 es ou 7 doノード.js

イテレータ
para podermos entender o conceito de async iterator ,プリザモのdar - uma recapitulada sobre o que s reco o iterator em siO MEU Artigo前方後円墳モーテル、Im Sama、es、Ma、Em Suma、Imイテレータnext() que retorna um outro objeto com a notaは、oを持ちます{value: any, done: boolean} オンデvalue ヴァーリ・デ・イテラ『アリア』についてdone Mais valores Na Sequenciaにおける同一性例としての単純なものとしてのイデアルの意味
const array = [1,2,3]
let index = 0

const iterator = {
  next: () => {
    if (index >= array.length) return { done: true }
    return {
      value: array[index++],
      done: false
    }
  }
}
Pizinho , Im Iterator N - To - To Nenhumaの利用についてiterable . ウムiterable Objeto que Possui uma ChaveSymbol.iterator queレトルーナ馬楽しみ俗語O、QualレトルナNosso iterador:
// ... Código do iterador aqui ...

const iterable = {
    [Symbol.iterator]: () => iterator
}
アゴラpodemosの利用可能なエレ正規for (const x of iterable) E teremos todos OSarray sendo iterador um a um

Se você quiser saber um pouco mais sobre Symbols, dê uma olhada neste outro artigo que escrevi só sobre o tema


por baixo dos panos , todos os array e objetor possuem umSymbol.iterator パラクササモスファーザーfor (let x of [1,2,3]) EレトルナーOS valore que queremos.

非同期イテレータ
<研究ノート>エスパー・アンド・エスペル『イ・アシン・イテレータ』についてSymbol.iterator , テモテSymbol.asyncIterator Em nosso iterable e , ao inv es s de um objeto que retorna{value, done} Teremos - umaは、聖なる解決を約束します.
VAMOS変圧器NOSSO反復子ACIMA EM‐UID非同期イテレータ
const array = [1,2,3]
let index = 0

const asyncIterator = {
  next: () => {
    if (index >= array.length) return Promise.resolve({done: true})
    return Promise.resolve({value: array[index++], done: false})
  }
}

const asyncIterable = {
  [Symbol.asyncIterator]: () => asyncIterator
}

イテレンド・ロバ
ポデモザfazer a iteraは、oを偽装します、そして、パーカーデformaマニュアル、chamando A楽しいnext() :
// ... Código do async iterator aqui ...

async function manual () {
    const promise = asyncIterator.next() // Promise
  await p // Object { value: 1, done: false }
  await asyncIterator.next() // Object { value: 2, done: false }
  await asyncIterator.next() // Object { value: 3, done: false }
  await asyncIterator.next() // Object { done: true }
}
<研究ノート>非対称イテレータ,テトスの利用for await , Por Les m , Lembre se queキーワードawait sは、USDAデモンドデ馬async function , Oh Seja , Temos que ter algo deste tipo :
// ... Código acima omitido ...

async function iterate () {
  for await (const num of asyncIterable) console.log(num) 
}

iterate() // 1, 2, 3
MAS、ASSIM como os iteradoresろばのncronos、nは、o s s o o suportadasなしノード8である.X OU 9非対称イテレータにおけるX ,パラポダーモスの利用next DOS seus objetos e iterar por eles manualmente :
// ... Código do async iterator aqui ...

async function iterate () {
  const {next} = asyncIterable[Symbol.asyncIterator]() // pegamos a função next do iterator

  for (let {value, done} = await next(); !done; {value, done} = await next()) {
    console.log(value)
  }
}
ペルセバquefor await muuito maisクリーンe muito mais conciso porque se comporta como um loop comum,mas tamb elm m,al e m de ser muito mais simples de de endender,チェパpelo final do iterador sozinho,atrav es s da chavedone .

トラートドエルロス
O ' acactece se nossa rejeitada dentroはnosso iteradorを約束しますか?Bem、como Qualshar Promise Rejeitada、Podemosペガーseu erro atravは、stry/catch エストモス・ユーザンドawait ):
const asyncIterator = { next: () => Promise.reject('Error') }
const asyncIterable = { [Symbol.asyncIterator]: () => asyncIterator }

async function iterate () {
  try {
      for await (const num of asyncIterable) {}
  } catch (e) {
    console.log(e.message)
  }
}

iterate()

フォールバック
アルゴ・バスタンテ・インタフェースのイテレータSymbol.iterator , Isosoの意味について
const fetch = require('node-fetch')
const promiseArray = [
  fetch('https://lsantos.dev'),
  fetch('https://lsantos.me')
]

async function iterate () {
  for await (const response of promiseArray) console.log(response.status)
}

iterate() // 200, 200

非同期発電機
em grande parte , iterator e async iterator podem ser criados parpartid degenerators . 発電機sは、oを楽しみます.next() .

Esta é uma descrição muito simplificada de generators, a leitura do artigo que fala somente sobre eles é imprescindível para que você possa entender generators de forma rápida e mais profunda.


Async Generator se comportam como um async iterator , Por Les M , Voc the deve Implentar o Mecanismo de Parada Manualmente , Por example , Vamos Construir um gerador de Mensagens aleat - de rias paraはgit para deixar seus colegas super - felited com suas - related i
const fetch = require('node-fetch')
async function* gitCommitMessageGenerator () {
  const url = 'https://whatthecommit.com/index.txt'

  while (true) {
    const response = await fetch(url)
    yield await response.text() // Retornamos o valor
  }
}
<研究ノート>「オベト」における既成概念との関係{value, done} , entはO O o Oループを返します.Podemos Maniententar UMA Fun Method O Desta forma :
// Código anterior omitido
async function getCommitMessages (times) {
  let execution = 1
  for await (const message of gitCommitMessageGenerator()) {
    console.log(message)
    if (execution++ >= times) break
  }
}

getCommitMessages(5)
// I'll explain this when I'm sober .. or revert it
// Never before had a small typo like this one caused so much damage.
// For real, this time.
// Too lazy to write descriptive message
// Ugh. Bad rebase.

カボデUSO
ParamificarデForma Mis Interessante、VAMOS Construir um Asyncイテレータパラum Coco de USO Real.ATUALMENTTE , Oドライバは、Oracleデータベースをパラノードにします.JS suporta uma APIデresultSet , QEのExecutaのUMAのクエリは、バンコデdados e retorna馬のretornagetRow() .
パラクリラモスresultSet Precisamos Executar UMAクエリーの禁止
const oracle = require('oracledb')
const options = {
  user: 'usuario',
  password: 'senha',
  connectString: 'string'
}

async function start () {
  const connection = await oracle.getConnection(options)
  const { resultSet } = await connection.execute('query', [], { outFormat: oracle.OBJECT, resultSet: true })
  return resultSet
}

start().then(console.log)
能勢resultSet ドウドー・シャドードgetRow() クーノンレタナオーマは、da PRを約束します.Podemosクリアーアムカーソルque NOSレトルナエステresultSet リンハ・ピ・リンハ.Vamos deixar um Pulco mais complex o atrav es s da cria pose o o de uma classeCursor :
class Cursor {
  constructor (resultSet) {
    this.resultSet = resultSet
  }

  getIterable () {
    return {
      [Symbol.asyncIterator]: () => this._buildIterator()
    }
  }

  _buildIterator () {
    return {
      next: () => this.resultSet.getRow().then((row) => ({ value: row, done: row === undefined }))
    }
  }
}

module.exports = Cursor
ベジャque oカーソルは、oになりますresultSet que El deve trabalhar e o armazena em seu estado ado .耳鼻咽喉科医のための第1回目の前のパラパラ-クresultSet De馬Nicaヴェズ:
const oracle = require('oracledb')
const options = {
  user: 'usuario',
  password: 'senha',
  connectString: 'string'
}

async function getResultSet () {
  const connection = await oracle.getConnection(options)
  const { resultSet } = await connection.execute('query', [], { outFormat: oracle.OBJECT, resultSet: true })
  return resultSet
}

async function start() {
  const resultSet = await getResultSet()
  const cursor = new Cursor(resultSet)

  for await (const row of cursor.getIterable()) {
    console.log(row)
  }
}

start()
Dista forma podemos fazer umループpor todas as nossas linhas retornadas sem precisar de uma resolu meres - o de de個人としての約束

結論
AsyncイテレータSは、極端なAmteramente Poderosos、特別なMierA e言語Linguagens DIN Maのas eロバが、Neconas como o Javascript、COM Ees voes - de Pode Tranformar UMA execuの上で、複雑なa complex a em um c - dio digo simples、esrichdo a maioria da complex idade do usuは、リオです.
メー・コンテの行為に関する一考察meu blog E SEinscreva na newsletter CIAの意味ではないパラレイバー!