非同期とコールバック/関数の作用ドメインチェーン


非同期とコールバック/関数の作用ドメインチェーン
非同期操作概要-阮一峰のjavascript教育
JavaScriptは一つのスレッドだけで実行します.JavaScriptは同時に一つのタスクしか実行できません.他のタスクは全部後ろに並んで待たなければなりません.
このようなモードのメリットは実現が比較的簡単で、実行環境が比較的単純であることです.悪いところは一つのタスクがある限り、時間がかかります.後のタスクは並んで待つ必要があります.プログラム全体の実行を遅らせます.
JavaScript言語自体は遅くないです.遅いのは、Ajaxが結果を返してくれるのを待って、外部データを読み書きすることです.この時、相手のサーバーがぐずぐずしていたり、ネットワークがうまくいかないと、シナリオが長時間停止してしまいます.
非同期とコールバック
同期タスクと非同期タスク
プログラム内のすべてのタスクは、同期タスクと非同期タスクに分類されます.
同期タスクは、エンジンにかけられずにメインスレッドに並べて実行するタスクです.前のタスクだけが実行されて、後のタスクが実行されます.
非同期タスクは、エンジンによってサイドに置かれ、メインスレッドに入らず、タスクのキューに入るタスクです.エンジンだけが、ある非同期タスクが実行できると考えています.(例えば、Ajax操作はサーバから結果を得ました).このタスクは(コールバック関数の形式を採用しています.)メインスレッドに入って実行されます.非同期タスクの後ろにあるコードは、非同期タスクの終了を待つ必要はなく、つまり、非同期タスクには「渋滞」「効果」がありません.
例えば、Ajax動作は同期タスクとして処理されても良いし、非同期タスクとして処理されても良いし、開発者によって決定されても良い.同期タスクであれば、Ajax操作の戻りを待ってから、メインスレッドが実行されます.非同期タスクであれば、Ajax要求を送信した後、直接下に実行します.Ajax操作の結果が来るまで、メインスレッドが再実行されます.のコールバック関数です
タスクのキューとイベントのループ
JavaScriptは実行中のメインスレッドの他に、エンジンは現在のプログラム処理を必要とする様々な非同期タスクを提供します.
まず、メインスレッドはすべての同期タスクを実行します.同期タスクが全部実行されると、タスクキューの中の非同期タスクを見に行きます.条件を満たすと、非同期タスクがメインスレッドに入り、実行を開始します.これは同期タスクになります.実行が終わると、次の非同期タスクがメインスレッドに入ります.一旦タスクキューが空になります.を選択します.プログラムは終了します.
非同期タスクの書き方は、通常はコールバック関数です.非同期タスクが再びメインスレッドに入ると、対応するコールバック関数が実行されます.非同期タスクには、コールバック関数がないと、タスクキューには入りません.つまり、再度メインスレッドには入りません.コールバック関数で次のステップの操作を指定していません.
JavaScriptエンジンはどうやって非同期タスクの結果を知っていますか?メインスレッドに入ることができますか?答えはエンジンがひっきりなしにチェックしています.何度も繰り返して、同期タスクが終わったら、エンジンがかけられた非同期タスクをチェックします.メインスレッドに入ることができますか?このような循環検査の仕組みは、イベントループ(Event Loop)といいます.ウィキペディアの定義は、「イベントサイクルは、メッセージとイベント(a programming construct that waits for and dispatches events or message in program)を待つためのプログラム構造である」ということです.
非同期、メインスレッド、イベントサイクル(Event Loop)について聞きました.次のように答えます.面接官は質問します.jsはシングルスレッドモードですが、彼はどうやって非同期操作を実現しますか?
  • jsのタスクは同期タスクと非同期タスクに分けられます.
  • 同期タスクは、メインスレッドに1つずつ実行されます.非同期タスクがタスクキューに入り、同期タスクが完了したら、ある条件をトリガしてから、メインスレッドにタスクを入れて実行します.
  • 非同期タスクの書き方は、通常はコールバック関数です.非同期タスクがメインスレッドに再入場されると、対応するコールバック関数が実行されます.
  • 同期タスクを実行した後、エンジンはもう一回検査します.JavaScriptエンジンはどうやって非同期タスクの結果を知っていますか?メインスレッドに入ることができますか?答えはエンジンがひっきりなしにチェックしています.繰り返して、同期タスクが完了すれば、それらの非同期タスクをチェックします.これはメインスレッドに入ることができますか?循環検査の仕組みは、イベントサイクルと呼ばれるものです.イベントサイクル機構は、もう一度チェックして、条件に合ったら、非同期タスクをメインスレッドの中に入れて実行します.(たとえば、ajaxが戻ったデータが来たら、set TimeOutの中の時間が来ます.)
  • 非同期操作の方法:1.コールバック関数2.イベントモニタ(トリガ条件、コールバック関数実行)3.ES 6:Promise
    タイマー
    これらはタスクのキューにタイムタスクを追加します.時間が来たら追加し、イベントのループがスキャンされ、スキャンしたら中のコールバック関数が実行されます.
    非同期操作
    非同期動作のモード--コールバック関数には、次のような問題がある.
    まず目覚ましをセットしたいです.三秒後にアラームが鳴ります.この時はまた起きます.
    コードがこのように書かれている場合:
    function setClock(){
      console.log('1     ,      ');
      setTimeout(()=>{
        console.log('2    ,    !');
      },3000)
    }
    
    function getUp(){
      console.log('3      ,    ')
    }
    setClock();//   
    getUp();//  
    結果:getUp();// は、この関数は3秒後に実行されるのではなく、setClock()が実行した直後に実行される.
    非同期とは、結果を待たずに、直接に次のステップを実行することである.setClock();// の実行が完了したら、直接に次のステップgetUp();// を実行することである.setClock();// は非同期コードであり、setClock()の実行が終わるまではgetUp()を実行し、setClock()は非同期タスクである.
    解決方法はコールバック関数を使用することです.コールバックは非同期の結果を得る方法です.
  • 同期:ダフ屋に切符を買ってもらいます.立って待っています.切符を買ってからください.他のものにします.
  • 非歩:ダフ屋に切符を買ってもらいます.(ダフ屋に切符を買ったらすぐにコールしてください.)その後は他のことを続けます.
    ここで: , は非同期です.括弧の中の( call )は折り返しです.
    calBack英語では折り返し電話という意味があります.電話をかけて帰って、その結果を教えてもらいました.この結果を続けて次のことをしてもいいです.calBackとはこの意味です.
    コードの実行が完了したら、次のコードを実行します.コードが実行されていないなら、次のコードを実行します.非同期です.
    コールバック関数を使う
    function setClock(callBack){
      console.log('1     ,      ');
      setTimeout(()=>{
        console.log('2    ,    !');
        callBack();
      },3000)
    }
    
    function getUp(){
      console.log('3      ,    ')
    }
    
    setClock(getUp);
    getUpをパラメータとしてsetClock関数に入力し、3秒後に実行関数getUpがコールバック関数である.
    同期と非同期を区別するsetTimeoutがあったからこそ非同期です.
    したがって、私たちはajaxを見に来ました.もし$ajax()が同期されているとしたら、私たちは要求を送信し、サーバーから返信された応答が来たら次のコードを実行し続けるとどうなりますか?
    要求の結果を直接に入手したいとすると、次のコードがあります.要求に応じてどれぐらいの時間が経過しても、応答が受信されるまで、この作成された変数responseに戻ります.もし送信要求から該当の2 sが取得されたら、コードはここで2 s停止します.$.ajax()は非同期です.私たちが受け取ったのは一つの約束だけです.実行すると約束しました.結果をもらった後に何を実行するかを約束しました.ですから、promise.then(success,error)を使って成功を約束した後にsuccess関数を実行できます.失敗を承諾した後にerror関数を実行します.このsuccesserrorです.(承諾)は非同期の仕事プロミセです.結果が得られないということを知っています.結果が出たら何をするかを約束したいです.callBackが戻ってきた結果は約束です.結果ではなく、まだ来ていません.
    コールバック関数を使う
    コールバックを使うにはこのような形が必要です.
    fn(  1,  2,()=>{
            (xxx,xxx,()=>{})
    })
    使わないでください
    fn(  1,  2,    (xxx,xxx))
    このパラメータに入ってくるPromiseは、関数自体ではなく、実行終了後の戻り値です.
    下に私を連れてきたのは私の小さな作品の中のコードの一部です.
    動く履歴書--完全コード住所 動く履歴書--プレビューアドレス
    関数のスコープ
    まず面接問題を見ます.
    var a = 1
    function fn1(){
      function fn2(){
        console.log(a)
      }
      function fn3(){
        var a = 4
        fn2()
      }
      var a = 2
      return fn3
    }
    var fn = fn1()
    fn() //2
    タイトル2
    var a = 1
    function fn1(){
      function fn3(){
        var a = 4
        fn2()
      }
      var a = 2
      return fn3
    }
    function fn2(){
      console.log(a)
    }
    var fn = fn1()
    fn() //1
    タイトル3
    var a = 1
    function fn1(){
    
      function fn3(){
        function fn2(){
          console.log(a)
        }
        var a
    
        fn2()
        a = 4
      }
      var a = 2
      return fn3
    }
    var fn = fn1()
    fn() //undefined
    復号
  • 関数は実行中に、まず自分の内部から変数を探します.
  • が見つからなかったら、現在の関数が作成されているスコープから探します.
  • 注意して探しているのは変数の現在の状態
  • です.