jsコードの非同期実行方式

3425 ワード

JavaScriptの実行環境はシングルスレッドであるため、jsコードの2つの実行方式をもたらす:
  • jsコードの先着順で実行されるシーケンス型
  • イベント駆動トリガで実行されるイベント型
  • jsコードの先着順で実行するシーケンス型
    つまり同期実行とは、位置が前のコードに対して実行された場合に、後続のコードを実行します.
    console.log('1');
    console.log('2');
    
    イベントドライバで実行するイベントタイプ
    function c(){
        console.log('3');
    }
    console.log('1');
    onclick = c();
    console.log('2');
    
    非同期実行:jsメインスレッドをブロックしない限り、実行されるコードは非同期で実行され、以上のクリックイベントトリガ関数c()の実行は後続コードの実行に影響しません.したがって、すべてのイベントトリガ関数は非同期的に実行されます.すなわち、第1の非同期的な実行方式です.イベント傍受onclick = c();から非同期的に実行される第二の方法を検討します.リリース・購読モード:まずonclickはjs元のイベントです.それでは私達がカスタマイズしたイベントに換えると、いわゆるリリース購読モードを構成します.カスタムイベントはカスタムイベントを参照してください.
  • 購読Event.on('click',fn)
  • リリースEvent.emit('click')
  • 以上、私たちがカスタマイズしたイベントclickのトリガfnの実行は、メインスレッドの実行順序に影響しないので、fn関数コードは非同期で実行される.イベントの公開購読モードから、第3の非同期の実行方法を検討します.
    const event = {};
    function on(type,callback){
         event.type = callback;
    }
    function emit(type){
          event.type();
    }
    
    以上は最も簡単なイベントのリリース購読です.つまりcallbackの実行です.以下は簡単な非同期です.
           function A(callback){
                console.log("I am A");
                  callback();  
                console.log("I am C")
            }
            function B(){
                setTimeout(function(){
                    console.log("I am B");
                },1000)
            }
            A(B);
    
    第4の非同期実行方式promiseを、コールバック関数から検討する.
            class Promisser{
                constructor(callback) {
                    this.res = this.res.bind(this);
                    this.rej = this.rej.bind(this);
                    this.state = {};
                    callback(this.res,this.rej)
                }
                res(val){
                    this.state.success = val
                }
                rej(err){
                    this.state.error = err
                }
                then(resCallback,rejCallback){
                    Object.defineProperty(this.state,'success',{
                        get: function () {
                            return this.state
                        },
                        set: function (newValue) {
                            resCallback(newValue);
                        }
                    })
                    Object.defineProperty(this.state,'error',{
                        get: function () {
                            return this.state
                        },
                        set: function (newValue) {
                            rejCallback(newValue);
                        }
                    })
                }
            }
    
            const test = new Promisser(function(res,rej){
                setTimeout(()=>{
                    res('success')
                },1000)
                setTimeout(()=>{
                    rej('error')
                },2000)
            })
            test.then((res)=>{
                console.log('111111',res) //111111 success
            },(rej)=>{
                console.log('222222',rej) //222222 error
            })
    
    以上は簡単なpromiss原生シミュレーションの実施であり、あくまでも対応する状態の変化を待ち受けるトリガ対応callbackの実行であり、実行された位置だけが関数の外部に移動していることがわかる.
    以上より
    jsで非同期的に実行される方法:イベント傍受、イベントのリリース・購読、promiseの非同期実行原理はすべてコールバック関数であり、js非同期実行の主な方法でもある.
    その他の非同期実行方式
    また、非同期的な実行方式es 6の新しいap Generator関数と対応するシンタックス糖async関数はここでは議論されません.