async/await の詳細

Jun 15, 2020 am 09:53 AM
async await

はじめに

面接中に、async/await は候補者の知識を確認する良い方法です。もちろん、この知識ポイントをどのような角度から説明するかは考えていません。インタビュアーに質問された場合は、自己実行ジェネレーターの構文糖について答えることができます。しかし、私はそれに少し気づいたでしょうか、それとも彼の認識を見たでしょうか?

babel の実装方法

注: ジェネレーターについて知らない場合は、まずジェネレーターを見て、ついでにイテレーターを見てみるのも良いでしょう。

例コード:

async function t() {
    const x = await getResult();
  	const y = await getResult2();
  	return x + y;
}
ログイン後にコピー

babel 変換コード

"use strict";

function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
    try {
        var info = gen[key](arg);
        var value = info.value;
    } catch (error) {
        reject(error);
        return;
    }
    if (info.done) {
        resolve(value);
    } else {
        Promise.resolve(value).then(_next, _throw);
    }
}

function _asyncToGenerator(fn) {
    return function () {
        var self = this, args = arguments;
        return new Promise(function (resolve, reject) {
            var gen = fn.apply(self, args);
            function _next(value) {
                asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
            }
            function _throw(err) {
                asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
            }
            _next(undefined);
        });
    };
}

function t() {
  return _t.apply(this, arguments);
}

function _t() {
  _t = _asyncToGenerator(function* () {
    const x = yield getResult();
    const y = yield getResult2();
    return x + y;
  });
  return _t.apply(this, arguments);
}
ログイン後にコピー

コードからわかるように、babelgenerator を変換します。 async の場合、_asyncToGeneratorasyncGeneratorStep の 2 つのステップが使用されます。

_asyncToGenerator何をしたのか

1. _asyncToGenerator を呼び出すと、promise が返されましたが、これはたまたま と一致していました。 async 関数は then 機能に接続できます。

2. 成功したメソッド _next を定義し、失敗したメソッド _throw を定義します。 2 つの関数では、asyncGeneratorStep が呼び出されます。 asyncGeneratorStep を読むと、これが実際には再帰であることがわかります。

3. _nextを実行します。それが上記の自己実行ジェネレーターです。

asyncGeneratorStep実行内容

1. Try-catch を実行して、generator の実行中にエラーをキャプチャします。エラーが報告された場合、async 関数は直接 reject ステータスに入ります。

2. infodone 値が true かどうかを確認します。true の場合、イテレータが実行されたことを意味します。値を 解決できます。 ###外出。それ以外の場合は、引き続き _next を呼び出して値を次の値に渡します。

这里我唯一没有看明白的是`_throw`,这个看代码像是执行不到的。promise.resolve状态值应该是fulfilled。看懂的
可以在评论中和我说一下,感谢。
ログイン後にコピー

async/await の利点

新しい構文糖衣が登場するたびに、前世代のソリューションの欠点を補わなければなりません。

例:

promise の出現は、

コールバック地獄 を回避するためです。これを回避する方法は、呼び出しをチェーンすることです。

async/await は何を解決しますか?


promise を async/await に置き換える必要性

非同期を処理する同期方法

async/await は同期スタイルに近いですが、promise はasync/awaitと比べるとコードが大きくなり、async/awaitと同期関数の違いはあまりありませんが、promiseの書き方にはまだギャップがあります。

Promise コードと async/await コードの比較

Promise バージョン

function getData() {
    getRes().then((res) => {
        console.log(res);
    })
}
ログイン後にコピー

async/await バージョン

const getData = async function() {
    const res = await getRes();
    console.log(res);
}
ログイン後にコピー

中間値

Promise を使用する場合、複数の Promise がシリアル化されると、後続の Promise が前の Promise の値を取得することが非常に困難であることがわかります。そして、async はこの問題を正確に解決します。

中間値を取得するための約束の例

const morePromise = () => {
	return promiseFun1().then((value1) => {
		return promiseFun2(value1).then((value2) => {
			return promiseFun3(value1, value2).then((res) => {
				console.log(res);
			})
		}) 
	})
}
ログイン後にコピー

上記はネストされたバージョンですが、さまざまなニーズに応じてネストできない場合があります。

const morePromise = () => {
	return promiseFun1().then((value1) => {
		return promiseAll([value1, promiseFun2(value1)])
	}).then(([value1, value2]) => {
		return promiseFun3(value1, value2).then((res) => {
			console.log(res);
		})
	})
}
ログイン後にコピー

ネストレベルは減りましたが、それでも満足のいくものではありません。

async/await 最適化の使用例

const morePromise = async function() {
	const value1 = await promiseFun1();
	const value2 = await promiseFun2(value1);
	const res = await promiseFun3(value1, valuw2);
	return res;
}
ログイン後にコピー

シリアル非同期プロセスには中間値が含まれる必要があるため、async/await の利点は明らかです。

条件付きステートメントの状況

たとえば、現在要件があるとします。データをリクエストした後、さらにデータをリクエストする必要があるかどうかを判断できます。 Promise を使用して実装した場合でも、ネストされたレベルが存在します。

const a = () => {
    return getResult().then((data) => {
        if(data.hasMore) {
            return getMoreRes(data).then((dataMore) => {
                return dataMore;
            })
        } else {
            return data;
        }
    })
}
ログイン後にコピー

ただし、async を使用してこの例を最適化すると、コードがより美しくなります。

async/await 最適化の例

const a = async() => {
    const data = await getResult();
    if(data.hasMore) {
        const dataMore = await getMoreRes(data);
        return dataMore;
    } else {
        return data;
    }
}
ログイン後にコピー

async/await の欠点

上で async/await の利点のいくつかについて説明しましたが、async/await は万能ではありません。 . .上記はすべてシリアル非同期シナリオに関するものです。並列非同期シナリオに移行する場合。

並列非同期シナリオ

const a = async function() {
    const res = await Promise.all[getRes1(), getRes2()];
    return res;
}
ログイン後にコピー

async/await エラー処理

エラー キャプチャでの async/await を実装するには、promise.all を使用する必要があります。主な側面はトライキャッチです。

try-catch

const a = async () => {
    try{
        const res = await Promise.reject(1);
    } catch(err) {
        console.log(err);
    }
}
ログイン後にコピー

promise のキャッチ

これを行うためにパブリック関数を抽出できます。各 Promise の後に catch 処理が続くため、コードは非常に長くなります。

const a = async function() {
    const res = await Promise.reject(1).catch((err) => {
        console.log(err);
    })
}
ログイン後にコピー
// 公共函数

function errWrap(promise) {
    return promise().then((data) => {
        return [null, data];
    }).catch((err) => {
        return [err, null];
    })
}
ログイン後にコピー
推奨チュートリアル: 「

JS チュートリアル

以上がasync/await の詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JavaScriptの文字列文字を交換します JavaScriptの文字列文字を交換します Mar 11, 2025 am 12:07 AM

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

カスタムGoogle検索APIセットアップチュートリアル カスタムGoogle検索APIセットアップチュートリアル Mar 04, 2025 am 01:06 AM

このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

独自のAjax Webアプリケーションを構築します 独自のAjax Webアプリケーションを構築します Mar 09, 2025 am 12:11 AM

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

例JSONファイルの例 例JSONファイルの例 Mar 03, 2025 am 12:35 AM

この記事シリーズは、2017年半ばに最新の情報と新鮮な例で書き直されました。 このJSONの例では、JSON形式を使用してファイルに単純な値を保存する方法について説明します。 キー価値ペア表記を使用して、あらゆる種類を保存できます

10 jQuery構文蛍光物 10 jQuery構文蛍光物 Mar 02, 2025 am 12:32 AM

コードプレゼンテーションを強化する:開発者向けの10個の構文蛍光物 ウェブサイトやブログでコードスニペットを共有することは、開発者にとって一般的な慣行です。 適切な構文ハイライターを選択すると、読みやすさと視覚的な魅力を大幅に改善できます。 t

8見事なjQueryページレイアウトプラグイン 8見事なjQueryページレイアウトプラグイン Mar 06, 2025 am 12:48 AM

楽なWebページレイアウトのためにjQueryを活用する:8本質的なプラグイン jQueryは、Webページのレイアウトを大幅に簡素化します。 この記事では、プロセスを合理化する8つの強力なjQueryプラグイン、特に手動のウェブサイトの作成に役立ちます

10 JavaScript&JQuery MVCチュートリアル 10 JavaScript&JQuery MVCチュートリアル Mar 02, 2025 am 01:16 AM

この記事では、JavaScriptとJQuery Model-View-Controller(MVC)フレームワークに関する10を超えるチュートリアルの厳選された選択を紹介します。これは、新年にWeb開発スキルを向上させるのに最適です。 これらのチュートリアルは、Foundatioのさまざまなトピックをカバーしています

' this' JavaScriptで? ' this' JavaScriptで? Mar 04, 2025 am 01:15 AM

コアポイント これは通常、メソッドを「所有」するオブジェクトを指しますが、関数がどのように呼び出されるかに依存します。 現在のオブジェクトがない場合、これはグローバルオブジェクトを指します。 Webブラウザでは、ウィンドウで表されます。 関数を呼び出すと、これはグローバルオブジェクトを維持しますが、オブジェクトコンストラクターまたはそのメソッドを呼び出すとき、これはオブジェクトのインスタンスを指します。 call()、apply()、bind()などのメソッドを使用して、このコンテキストを変更できます。これらのメソッドは、与えられたこの値とパラメーターを使用して関数を呼び出します。 JavaScriptは優れたプログラミング言語です。数年前、この文はそうでした

See all articles