ジェニーン・レイトとasync/await


ジェニーン・レイトとは?


ES 6に導入されたサードパーティ🔑 コードブロックを一時停止し、必要に応じて再実行できる特殊な関数です.
一般的な関数との違いは、次のとおりです.
1.「関数呼び出し者は、関数が実行する制御権を関数呼び出し者に譲渡することができる.」
:通常の関数を呼び出すと、関数の実行制御権が関数に移行し、関数コードがバッチ処理されます.すなわち、関数呼び出し者は、関数を呼び出した後に関数の実行を制御できない.🐱 関数呼び出し文は、関数の実行を制御します.これは、関数によって排他されるのではなく、関数呼び出し元に関数制御権を譲渡できることを意味します.
2.「関数呼び出し元とステータスを交換できます.」
:通常の関数を呼び出すと、パラメータによって外部値が渡され、関数コードがバッチで実行され、戻り値が関数外部に返されます.つまり、関数の実行時に、関数の外部から内部に値を渡すことはできません.🐹 関数呼び出し者と関数の状態を双方向に交換できます.すなわち、状態を関数呼び出し元に渡すこともできるし、関数呼び出し元から状態を受信することもできる.
3.「1つ以上のマネージャ関数を呼び出すと、1つ以上のマネージャオブジェクトが返されます.」
:一般関数を呼び出すと、関数コードがバッチ処理され、戻り値が返されます.
🐶 ウィジェット関数を呼び出すと、関数コードを実行するのではなく、同時にウィジェットとして機能するウィジェットオブジェクトが返されます.

マネージャ関数の定義


JENNER関数はfunction*キーワードとして定義される.1つ以上の最終品目文が含まれます.
// 제너레이터 함수 선언문
function genFunc() {
	yield 1;
}

// 제너레이터 함수 표현식
const genFunc = function* () {
	yield 1;
|

// 제너레이터 메서드
const obj = {
	* genFunc() {
    	yield 1;
    }
};

// 제너레이터 클래스 메서드
class MyClass {
	* genFunc() {
    	yield 1;
    }
}
🍘 ただし、矢印関数で関数を定義したり、new演算子を持つコンストラクション関数で関数を呼び出すことはできません.マネージャ関数はインスタンスではなくマネージャオブジェクトを返します.

マネージャオブジェクト


ウィジェット関数を呼び出すと、ウィジェットオブジェクトが作成され、返されます.マネージャ関数で返されるマネージャオブジェクトは、イテレーションであり、イテレーションでもあります.
🔑 つまりサードパーティオブジェクトはSymbolです.反復メソッドのイテレーションを継承し、nextメソッドのイテレーションを持ち、valueとdone Propertyを持つイテレーションツリー・セクション・オブジェクトを返します.
デフォーマオブジェクトはnextメソッドを持つイテレーションですが、returnメソッドとthrowメソッドは通常のイテレーションには存在しません.マネージャオブジェクトの3つのメソッドを呼び出すと、次のように動作します.

  • nextメソッドを呼び出して、実行コードブロック(サードパーティ関数から最終品目式まで)を実行し、最終品目値をvalue property値としてdone propertyに指定されたイテレーションオブジェクト(コードが最後まで実行されるかどうかをブール値で示す)を返します.

  • returnメソッドを呼び出すと、受信した値を引数としてvalue property値に渡し、trueをdone property値とするイテレーションツリー・セクション・オブジェクトが返されます.

  • throwメソッドを呼び出すと、パラメータに渡されるエラーが発生し、undefinedをvalue property、trueをdone propertyとするイテレーションツリー・セクション・オブジェクトが返されます.
  • マネージャの一時停止と続行


    🍘 yieldキーワードとnextメソッドを使用して関数の実行を一時停止し、必要に応じて実行を再開できます.一般的な関数は、呼び出し後に関数によって制御権を独占的に実行されますが、関数が実行する制御権を関数呼び出し元に譲渡することで、必要に応じて関数実行を再開できます.
    Jerrential関数を呼び出すと、Jerrenter関数ではなくJerrenterオブジェクトが返されます.イテレーションとイテレーションのイテレーションオブジェクトにはnextメソッドがあります.マネージャオブジェクトのnextメソッドを呼び出すと、マネージャ関数のコードブロックが実行されます.
    🍶 ただし、通常の関数のように、コードブロック内のすべてのコードを一括実行するのではなく、完成品式のみを実行します.yieldキーワードはjenervisor関数の実行を一時停止するか、式の計算結果をjenervisor関数呼び出し元に返します.
    function* genFunc() {
    	yield 1;
        	yield 2;
        	yield 3;
    }
    const generator = genFunc();  // 제너레이터 객체 생성
    // next 메서드 호출시 이터레이터 리절트 객체를 반환
    generator.next(); // { value: 1, done: false }
    generator.next(); // { value: 2, done: false }
    generator.next(); // { value: 3, done: false }
    generator.next(); // { value: undefined, done: true }
    JENNER LATERオブジェクトのnextメソッドを呼び出すと、完成品式のみが実行され、一時停止します.このとき,関数実行の制御権は関数の呼び出し元に譲渡される.呼び出し元が後で必要に応じてnextメソッドを再度呼び出すと、一時停止したコードから次の完成品式まで実行を続行し、再び一時停止します.
    🥝 マネージャ・オブジェクトの次のメソッドは、value、done propertyを持つイテレーション・ツリー・セクション・オブジェクトを返します.nextメソッドが返すイテレーションツリー・セクション・オブジェクトのvalue propertyには、完成品式から得られた値を表すブール値が割り当てられ、done propertyには、イテレーション関数が最後まで実行されたかどうかを示すブール値が割り当てられます.
    これにより、nextメソッドを繰り返し呼び出し、実行および一時停止操作を最終品目式にループし、2番目のメソッドが返すイテレーションツリーオブジェクトのvalue propertyでサードパーティ関数の戻り値を指定し、done propertyではサードパーティ関数の実行が最後まで実行されることを示します.ミハはtrueとして割り当てられた.
    従来のイテレーションオブジェクトのnextメソッドとは異なり、パラメータをイテレーションオブジェクトのnextメソッドに渡すことができます.🔑 渡されたパラメータは、サードパーティ関数の収益率式を提供する指定された変数に割り当てられます.つまり、配当収益率式の変数は、収益率値を割り当てないことに注意してください.
    function* genFunc() {
    	const x = yield 1;
        	cosnt y = yield (x + 10);
       	return x + y;
    }
    const generator = genFunc(); // 제너레이터 객체 생성
    // next 메서드 호출시 이터레이터 리절트 객체 반환
    generator.next(); // { value: 1, done: false }
    generator.next(10); // { value: 20, done: false }
    generator.next(20); // { value: 30, done: true }
    🔑 これにより,next法と降伏式により関数呼び出し者と関数との間で状態を交換することができる.

    async / await


    ES 8では、同期処理のように非同期処理をより簡単に、より読み取り可能にするasync/awaitが導入されている.
    🍘 async/awaitはプロセスに基づいています.async/awaitはプロセスの後続処理方法であり、その後、コールバック関数をcatchおよびfinallyの後続処理方法に渡し、非同期処理結果を後続処理することなく、プロセスを同期処理のように使用します.
    🔑 これは、プロセスの後続の処理方法を必要とせずに、同期処理のように処理結果を返すプロセスを実装できることを意味します.

    async関数


    🥝 awaitキーワードはasync関数でのみ使用できる必要があります.async関数はasyncキーワードで定義され、常にプロセスに戻ります.[基本情報](Basic Information)が明示的に返されていない場合でも、既定値の[基本情報](Basic Information)が返されます.
    // async 함수 선언문
    async function foo(n) { return n; }
    
    // async 함수 표현식
    const foo = async function(n) { return n; }
    
    // async 화살표 함수
    
    
    // async 메서드
    const obj = {
    	async foo(n) { return n; }
    }
    
    // async 클래스 메서드
    class MyClass {
    	async foo(n) { return n; }
    }
    asyncメソッドも、新しい演算子とともにコンストラクション関数として呼び出すことはできません.async関数は、インスタンスではなく常にプロセスを返します.

    awaitキーワード


    🔑 awaitキーワードは、プロセスが解決済み状態に入るのを待って、解決済み状態のときにプロセスによって解析された処理結果を返します.awaitキーワードはfromisの前で使用する必要があります.
    const getGithubUserName = async id => {
    	// await 키워드는 프로미스가 settled 상태가 될 때까지 대기하였다가, 프로미스가 settled 상태가 되면 resolve한 값을 반환한다.
    	const res = await fetch(`https://api.github.com/{id}`};  // res 변수에 Resoponse 객체 할당
        	const { name } = await res.json();
        	console.log(name);
    };
    awaitキーワードは、プロセスが一定状態に達するのを待って(非同期処理が完了した)、サーバがfetch関数に対して実行するHTTP要求に応答して、fetch関数が返すプロセスの非同期処理状態が完了するまで待機する.その後、プロセスが決定されると、プロセス解析の処理結果はres変数に割り当てられます.
    🔑 これによりawaitキーワードは次の実行を一時停止し、promisステータスが決定した後に再起動します.これにより、同期処理と同様の非同期処理機能を実現することができる.

    エラー処理


    非同期コールバックモードでは,エラー処理が困難であることが最大の問題である.エラーは、非同期関数を呼び出すコールバック関数が非同期関数ではないため、try...catch文はエラーをキャプチャできません.
    async/awaitでエラー処理はtry...catch文を使用してスナップできます.コールバック関数をパラメータとして渡す非同期関数とは異なり、🍒 戻りプロセスの非同期関数を明示的に呼び出すことができるため、呼び出し元は明確です.
    🧚 async関数でcatch文でエラーが処理されていない場合、async関数はエラーを拒否するプロセスを返します.したがって、async関数を呼び出した後、Pormiseを使用します.prototype.catchメソッドを使用してエラーをキャプチャすることもできます.