序文非同期イテレータは Node.js v10.0.0 から存在しており、最近コミュニティで注目を集めています。この記事では、非同期イテレータの役割について説明し、非同期イテレータが何に使用される可能性があるかという疑問にも取り組みます。 非同期イテレータとは何ですか?では、非同期イテレータとは何でしょうか?これらは実質的に、以前使用可能だったイテレータの非同期バージョンです。反復の値と最終ステータスがわからない場合は、非同期イテレータを使用できます。最終的には、{value:any、done:boolean} オブジェクトに解決できる promise が得られます。また、非同期イテレータをループするのに役立つ for-await-of ループも用意しました。同期イテレータの for-of ループと同じです。 非同期イテレータの定数は[1, 2, 3]です。 asyncIterable[Symbol.asyncIterator] = 非同期関数*() { (i = 0 とします; i < asyncIterable.length; i++) { yield { 値: asyncIterable[i], 完了: false } } 結果: true }; (非同期関数() { for await (asyncIterable の const 部分) { console.log(一部); } })(); 通常の for-of ループとは対照的に、for-await-of ループは、受信した各 Promise が解決されるまで待機してから、次の Promise に進みます。 現在、ストリーム以外に非同期反復をサポートする構造は多くありませんが、ここに示すように、反復可能な構造に表記法を手動で追加できます。 非同期イテレータストリームとして非同期イテレータはストリームを処理するときに非常に便利です。読み取り可能、書き込み可能、二重、および変換ストリームはすべて非同期イテレータをサポートします。 非同期関数 printFileToConsole(path) { 試す { const readStream = fs.createReadStream(path, { エンコーディング: 'utf-8' }); for await (const chunk of readStream) { console.log(チャンク); } console.log('EOF'); } キャッチ(エラー) { コンソール.log(エラー); } } このようにコードを記述すると、反復処理して各データ チャンクを取得するときにデータ イベントと終了イベントをリッスンする必要がなくなり、ストリーム自体が終了すると for-await-of ループも終了します。 ページング機能を備えたAPIの呼び出し非同期反復を使用して、ページネーションを使用するソースからデータを簡単に取得することもできます。これを行うには、Node https リクエスト メソッドが提供するストリームから応答本文を再構築する方法も必要です。 https リクエストとレスポンスは Node 内のストリームなので、ここで非同期イテレータを使用することもできます。 定数 https = require('https'); 関数 homebrewFetch(url) { 新しい Promise(async (resolve, reject) => { を返します。 const req = https.get(url, 非同期関数(res) { (res.statusCode >= 400)の場合{ 拒否を返します(新しいエラー(`HTTP ステータス: ${res.statusCode}`)); } 試す { 本文を '' とします。 /* ストリーム内のデータをリッスンする代わりに、 for-await-ofを使用してデータチャンクを追加することができます レスポンス本文の残りの部分*/ for await (const chunk of res) { 本体 += チャンク; } // 本文がない場合の処理 if (!body) resolve({}); // 本文は文字列なので、JSON を取得するには解析する必要があります。const result = JSON.parse(body); 解決(結果); } キャッチ(エラー) { 拒否(エラー) } }); 要求を待機します。 要求を終了します(); }); } Cat API にリクエストを送信して、10 匹ずつの猫の写真を取得します。また、cat API の過負荷を回避するために、リクエスト間に 7 秒の遅延を追加し、最大ページ数を 5 にします。 また、cat API の過負荷を回避するために、リクエスト間に 7 秒の遅延を追加し、最大ページ数を 5 にします (過負荷になると壊滅的な結果となるため)。 関数 fetchCatPics({ limit, page, done }) { homebrewFetch を返します(`https://api.thecatapi.com/v1/images/search?limit=${limit}&page=${page}&order=DESC`) .then(本文 => ({ 値: 本文、完了 })); } 関数catPics({limit}){ 戻る { [Symbol.asyncIterator]: 非同期関数*() { 現在のページを 0 にします。 // 5ページ後に停止 現在のページが 5 未満の場合 試す { const cats = fetchCatPics({ currentPage, limit, done: false }) を待機します。 console.log(`${limit} 匹の猫を取得しました`); 猫を飼う; 現在のページ++; } キャッチ(エラー) { console.log('すべての猫を取得中にエラーが発生しました!'); コンソール.log(エラー); } } } }; } (非同期関数() { 試す { for await (let catPicPage of catPics({ limit: 10 })) { コンソールにログ出力します。 // リクエスト間で7秒間待機する 新しい Promise(resolve => setTimeout(resolve, 7000)) を待機します。 } } キャッチ(エラー) { コンソール.log(エラー); } })() こうすることで、7 秒ごとに猫の写真のページ全体が自動的に取得され、お楽しみいただけます。 ページ間を移動するより一般的な方法は、 next メソッドと previous メソッドを実装し、それらをコントロールとして公開することです。 関数actualCatPics({limit}){ 戻る { [シンボル.asyncIterator]: () => { ページを 0 にします。 戻る { 次へ: 関数() { ページ++; fetchCatPics({page,limit,done:false}) を返します。 }, 前: 関数() { (ページ > 0) { ページ - ; fetchCatPics({page,limit,done:false}) を返します。 } fetchCatPics({ page: 0, limit, done: true }); を返します。 } } } }; } 試す { const someCatPics = 実際のCatPics({ 制限: 5 }); const { next, previous } = someCatPics[Symbol.asyncIterator](); 次に()します。その後(console.log); 次に()します。その後(console.log); 前回の().その後(console.log); } キャッチ(エラー) { コンソール.log(エラー); } ご覧のとおり、非同期イテレータは、データのページを取得したり、アプリケーションの UI で無限スクロールなどの操作を実行したりするときに非常に便利です。 これらの機能はしばらく前からブラウザに搭載されており、Chrome v63 以降、Firefox v57 以降、Safari v11.1 で利用できます。ただし、現在 IE と Edge では利用できません。 上記は、Node.js の非同期イテレータの詳細な説明です。Node.js の非同期イテレータの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Tomcat の構成と最適化ソリューションの詳細な説明
>>: CentOS 7.4 にソースコードから MySQL 8.0 をインストールするための詳細なチュートリアル
序文MySQL は、クライアント/サーバー構造に基づく、高速、高性能、マルチスレッドのオープン ソー...
1. パスワードを変更する1. 一般ユーザーのパスワードを変更する パスワード現在のパスワードを入力...
要素 ui テーブルにはドラッグ アンド ドロップによる並べ替え機能が組み込まれておらず、サードパー...
要点CSS resize プロパティを使用すると、要素のサイズ変更可能性を制御できます。サイズ変更を...
水平方向では、テーブル ヘッダーの配置を左、中央、右に設定できます。基本的な構文<TH ALI...
win7 64 ビットで mysql-5.7.5-m15-winx64 をインストールして構成する方...
注意: 計画、設計、開発のいずれの場合でも、これらの間違いは避けなければなりません。 1. ナビゲー...
最近、Web ページに複数の画像をアップロードするためのスクリプトを作成しました。これは非常に実用的...
1.ファビコン.cc ico アイコンの Web サイトをオンラインで作成するには、画像をアップロー...
目次序文DockerファイルDockerfile とは何ですか? Dockerfile 構文Spri...
開発においては、一覧から詳細ページにジャンプし、また詳細ページに戻る際に一覧ページの状態(スクロール...
コンテナの起動コマンドを取得する方法コンテナはすでに作成されていますが、その起動パラメータ(データが...
/****************** * カーネルデバッグ技術 ****************...
Redux はシンプルな状態マネージャーです。その歴史をたどることはしません。使用法の観点から見ると...
絶対、相対、固定位置の位置決めabsolue: 絶対配置。上、下、左、右を使用して、配置先の親要素に...