JS ループで async と await を正しく使用する方法

JS ループで async と await を正しく使用する方法

概要(ループモード - 共通)

  • のために
  • 地図
  • フィルター

配列と非同期メソッドを宣言して反復する

配列を宣言する: ⬇️

const スキル = ['js'、'vue'、'node'、'react']

別のPromise非同期コードを宣言します: ⬇️

関数 getSkillPromise (値) {
  新しい Promise を返します ((resolve, reject) => {
    タイムアウトを設定する(() => {
      解決(値)
    }, 1000)
  })
}

forループで使用する

for ループは関数ではなく、関数内で async と await を使用する必要があるため、for ループ内に関数のレイヤーをラップする必要があります。

非同期関数テスト(){
  (i = 0 とします; i < スキルの長さ; i++) {
    const スキル = スキル[i]
    const res = getSkillPromise(skill) を待機します
    コンソール.log(res)
  }
}

test() // 呼び出し

await を使用する場合、待機中の promise が結果を返すまで JavaScript の実行を一時停止する必要があります。上記の結果は、for ループ内に非同期コードがある場合、for ループ内の非同期コードが完全に実行されるまで待ってから、for ループ後のコードを実行できることを意味します。

しかし、forEach、map、filter などのコールバック ループは処理できません。以下は詳細な分析です。

マップでの使用

map で await を使用する場合、非同期関数は常に promise を返すため、map の戻り値は常に promise 配列になります。

非同期関数テスト(){
  コンソールログ('開始')
  const res = skills.map(非同期アイテム => {
    getSkillPromise(item) を待機して戻ります。
  })
  コンソール.log(res)
  コンソールログ('終了')
}

テスト()

結果:常に約束の配列

始める
[
  Promise { <保留中> },
  Promise { <保留中> },
  Promise { <保留中> },
  約束 { <保留中> }
]
終わり

Promise が満たされるまで待機したい場合は、promise.all() を使用して処理できます。

非同期関数テスト(){
  コンソールログ('開始')
  const res = skills.map(非同期アイテム => {
    getSkillPromise(item) を待機して戻ります。
  })
  const resPromise = Promise.all(res) を待機します
  コンソールログ(resPromise)
  コンソールログ('終了')
}

テスト()

// 結果開始
[ 'js'、'vue'、'node'、'react' ]
終わり

forEachで使用する

まず、コードと結果

非同期関数テスト(){
  コンソールログ('開始')
  スキル.forEach(非同期アイテム => {
    const res = getSkillPromise(item) を待機します
    コンソール.log(res)
  })
  コンソールログ('終了')
}

テスト()

期待される結果

'始める'

'js'

「ビュー」

'ノード'

「反応する」

'終わり'

実際の結果は、forEach ループが非同期結果が返されるのを待機する前に、console.log('end') が実行されることです。

'始める'

'終わり'

'js'

「ビュー」

'ノード'

「反応する」

JavaScript の forEach は Promise の認識をサポートしておらず、async と await もサポートしていないため、forEach で await を使用することはできません。

フィルターで使用する

フィルターを使用して、アイテムを vue または react オプションとしてフィルターします。

フィルターを通常どおり使用します:

非同期関数テスト(){
  コンソールログ('開始')
  const res = スキル.フィルター(アイテム => {
    ['vue', 'react'].includes(item) を返します。
  })
  コンソール.log(res)
  コンソールログ('終了')
}

test() // 呼び出し // 結果開始
[ 'vue'、'react' ]
終わり

await を使用した後:

非同期関数テスト(){
  コンソールログ('開始')
  const res = skills.filter(非同期アイテム => {
    const スキル = getSkillPromise(item) を待機します
    ['vue', 'react'].includes(item) を返します。
  })
  コンソール.log(res)
  コンソールログ('終了')
}

テスト()

期待される結果:

始める

[ 'vue'、'react' ]

終わり

実際の結果:

[ 'js'、'vue'、'node'、'react' ]

終わり

結論: 非同期関数 getSkillPromise によって返される promise は常に true であるため、すべてのオプションがフィルターを通過します。

使用概要を添付

  1. await 呼び出しを連続して実行する場合は、 for ループ (またはコールバックのない任意のループ) を使用します。
  2. forEach では await を使用しないでください。代わりに for ループ (またはコールバックのない任意のループ) を使用してください。
  3. filter と Reduce では await を使用しないでください。必要に応じて、map を使用して結果をさらに処理し、filter と Reduce を使用して結果を処理します。

結論:作業中に発生した大規模なフォーム抽出コンポーネントのため、非同期検証でこの問題が発生しました。その後、データを調べた後、結果が要約されました。

要約する

JS ループでの async と await の正しい使用法に関するこの記事はこれで終わりです。JS ループでの async と await の使用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JS で async await をエレガントに使用する方法
  • JavaScript のよりエレガントなエラー処理方法 async await
  • JavaScript の async と await のシンプルで詳細な学習
  • JavaScript における async と await の使い方とメソッド
  • JavaScript PromiseとAsync/Awaitの詳細な説明
  • JS で async と await を使用する方法

<<:  MySQL 面接の質問: ハッシュ インデックスの設定方法

>>:  HTMLのテーブルタグの基本学習チュートリアル

推薦する

Vue はデータの変更をどのように追跡しますか?

目次背景例誤解 - コールスタックを表示するためにウォッチでブレークポイントを設定する正しいアプロー...

MySQLとOracleの違いのまとめ(機能性能の比較、選択、使用時のSQLなど)

1. 同時実行性同時実行性は OLTP データベースの最も重要な機能ですが、同時実行性にはリソース...

Zabbixは複数のmysqlプロセスの監視を実装します

1 つのサーバー上で 3 つの MySQL インスタンス プロセスが開始され、それぞれ異なるポート ...

さまざまなMySQLインデックスの使用方法の詳細な説明

1. 遅いクエリログ1.1 MySQL ログの種類ログは、データベースの操作や、ユーザーがデータベー...

React Nativeでシンプルなゲームエンジンを作る

目次導入始めるReact Nativeゲームエンジンの簡単な紹介React Nativeでスネークゲ...

Node.js のイベント モジュールに関する知識ポイントのまとめ

Node の研究と応用を通じて、NodeJS はシングルスレッド、イベント駆動型、非ブロッキング I...

JavaScript コードベースをよりクリーンにする 5 つの方法

目次1. 短絡や条件文の代わりにデフォルトのパラメータを使用する2. 複数の条件の処理3. スイッチ...

WeChatアプレットがジグソーパズルゲームを実装

この記事では、WeChatアプレットでジグソーパズルゲームを実装するための具体的なコードを参考までに...

HTML タグに類似: strong および em、q、cite、blockquote

XHTML には似た機能を持つタグがいくつかあります。もちろん、ここでの類似性とは意味の類似性を指...

MySQLで重複行を削除する方法

SQL文 /* MySQL で重複行を削除するいくつかの方法 ---Chu Minfei ---20...

React コンポーネントのコンストラクタとスーパーの知識ポイントのまとめ

1. Reactでクラス宣言する際のヒント 上記のように、Child クラスは class キーワー...

W3C標準に準拠したHTML標準で注意すべき点を詳細に解説

XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE html PUB...

MySQL クエリのソートとクエリ集計関数の使用法の分析

この記事では、例を使用して、MySQL クエリのソート関数とクエリ集計関数の使用方法を説明します。ご...

フローティングをクリアするいくつかの方法(推奨)

1. 同じタイプの空の要素を追加し、要素の CSS 属性 clear:both; を設定します。 ...

ウェブデザインスキル:中国語と英語が混在するウェブページの上位表示の問題

<br />私はこの問題で気が狂いそうです。症状は次のとおりです。 症状の説明: Int...