17日目

16111 ワード


Promise


JavaScriptは単一スレッド言語です.(プライマリスレッドとcallスタックで構成されています!)
また、非同期の作業も同時に行うことができます.
奥応?🤢 一度に1つのタスクしか処理できませんが、どのように同時に実行しますか?
→JavaScriptはコアエンジンだけ持って帰らない!
同時実行は、実行環境(実行時)のヘルプで実行します.
(WebAPI(dom, ajax, setTimeout...), Task Queue、Event Loopなどと一緒に作業しています.)

コールバックとは?


コールバックはJavaScriptが非同期処理を行うモードの一つです!
従来のコールバックモードでは、コールバックhellと呼ばれる多くの重複問題が発生しやすい.

コールバックヘリコプター


非同期処理の増加(非同期処理の増加に続く)に伴い、呼び出しは重なり続け、コードが深くなり、管理がさらに困難になる.このような深い重なりは、復調螺旋や滅亡のピラミッドと呼ばれている.
function async1('a', function (err, async2){
	if(err){
		errHandler(err);
	}else{
		...
		async2('b', function (err, async3){
			...
		}){
			...
		}
	}
});
  • このようなコールバックヘリコプターが発生した原因は?
  • 非同期処理の場合、実行完了を待たずに、次のタスクを直接実行します.
  • 、すなわち、コードを所望の順序で書き続けることは、タスクを完了することはできません.
  • 非同期処理関数で処理結果が返されると、必要な操作は実行されないため、コールバック関数を使用して必要な操作が行われます.
  • がコールバック関数内で別の非同期動作を必要とする場合、上記のオーバーラップが発生し、コールバックhellが生成される.😢
  • フラミスとは何ですか。


    非同期演算の終了後の結果を知るオブジェクト!
    インフラストラクチャを使用すると、同期メソッドのように非同期メソッドの値を返すことができます.
    ES 6が導入した別の非同期処理モードは、従来のコールバックモードによるコールバックスパイラルに起因する.
    非同期処理時点をより明確に表現できます!

    インフラストラクチャの作成

  • インフラストラクチャはPromiseコンストラクション関数です(newキーワードを覚えてください!)作成します.
  • は、コールバック関数をパラメータとして受信し、非同期動作を実行する.
  • // 프라미스 객체를 만듭니다. 
    // 인자로는 (resolve, reject) => {} 이런 excutor 실행자(혹은 실행 함수라고 불러요.)를 받아요.
    // 이 실행자는 비동기 작업이 끝나면 바로 두 가지 콜백 중 하나를 실행합니다.
    // resolve: 작업이 성공한 경우 호출할 콜백
    // reject: 작업이 실패한 경우 호출할 콜백
    const promise = new Promise((resolve, reject) => {
    	if(...){
    		...
    		resolve("성공!");
    	}else{
    		...
    		reject("실패!");
    	}
    });

    インフラストラクチャのステータス値

  • pending:非同期処理を実行する前(解析および拒否は呼び出されていません)
  • 完了
  • :実行成功(呼び出し解析)
  • 拒否:実行失敗(呼び出し拒否)
  • ソリューション:成功または失敗(解決を要求または拒否)
  • インフラストラクチャの後続処理方法


  • Primisによって実装された非同期関数はPrimisオブジェクトを返します!

  • インフラストラクチャによって実装される非同期関数を呼び出す側は、このインフラストラクチャオブジェクトの後続の処理方法によって非同期処理結果(成功またはエラーメッセージ)を受信して処理する必要があります.

  • .then(成功時、失敗時)
    その後、最初のパラメータは成功時に実行され、2番目のパラメータは失敗時に実行されます.(最初のパラメータをスキップできます!)
    // 프라미스를 하나 만들어 봅시다!
    let promise = new Promise((resolve, reject) => {
    	setTimeout(() => resolve("완료!"), 1000);
    });
    
    // resolve
    promise.then(result => {
    	console.log(result); // 완료!가 콘솔에 찍힐거예요.
    }, error => {
    	console.log(error); // 실행되지 않습니다.
    });
    // 프라미스를 하나 만들어 봅시다!
    let promise = new Promise((resolve, reject) => {
    	setTimeout(() => reject(new Error("오류!")), 1000);
    });
    
    // reject
    promise.then(result => {
    	console.log(result); // 실행되지 않습니다.
    }, error => {
    	console.log(error); // Error: 오류!가 찍힐거예요.
    });

  • .catch(失敗時)
    // 프라미스를 하나 만들어 봅시다!
    let promise = new Promise((resolve, reject) => {
    	setTimeout(() => reject(new Error("오류!"), 1000);
    });
    
    promise.catch((error) => {console.log(error};);
  • コミットメントチェーン


    インフラストラクチャは、複数のインフラストラクチャに接続するための後続の処理方法を採用します.△これはコールバックのヘルプを解決することができます.
    -チェイニンは?それはどうしますか.
        후속 처리 메서드 (then)을 쭉쭉 이어 주는 거예요.
        
        ```jsx
        new Promise((resolve, reject) => {
        	setTimeout(() => resolve("promise 1"), 1000);
        }).then((result) => { // 후속 처리 메서드 하나를 쓰고,
        	console.log(result); // promise 1
        	return "promise 2";
        }).then((result) => { // 이렇게 연달아 then을 써서 이어주는 거예요.
        	console.log(result);
        	return "promise 3";
        }).then(...);
        ```

    async, await


    これからは本当にたくさんの文法を読むことができます.
    Primisの使い勝手がとても便利になりました!🙂
    [詳細について]
    授業中に議論しないで、「マイブラウザ」という関数とかわいいことを知っていれば、もっといいです.
    1. async
    -関数の前にasyncを付けます.
    -常にインフラストラクチャに戻ります.△プラミスの値段でなくても、プラミスで包んで返してください.
    ```jsx
    // async는 function 앞에 써줍니다.
    async function myFunc() {
    	return "프라미스를 반환해요!"; // 프라미스가 아닌 걸 반환해볼게요!
    }
    
    myFunc().then(result => {console.log(result)}); // 콘솔로 확인해봅시다!
    ```

  • await
  • asyncの同席です.(asyncがないと使えない!)
  • async関数でのみ動作します.
  • を待っていたフラミスが処理され、その後結果が返されます!
  • async function myFunc(){
    	let promise = new Promise((resolve, reject) => {
    		setTimeout(() => resolve("완료!"), 1000);
    	});
    
        console.log(promise);
    
    	let result = await promise; // 여기서 기다리자!하고 신호를 줍니다.
    
        console.log(promise);
    
    	console.log(result); // then(후처리 함수)를 쓰지 않았는데도, 1초 후에 완료!가 콘솔에 찍힐거예요.
    }
    waitに遭遇した場合、実行を一時停止し、インフラストラクチャ処理後に実行を再開します.
    すなわちawaitを書くと関数が実行を待つ.
    また、昨日作成したログイン機能はそれぞれ実現しました.
    本当に量が多すぎて、敵に勇気がありません...
    もう午前3时半です.
    機会があれば、別途整理します.
    明日ではありません.今朝寝ます.