js異步

單線程

單線程,可是js的引擎不僅有一個線程,還能夠其餘任務線程;
事件驅動:觸發事件就執行。
採用事件循環機制,先將主線的任務(同步)執行完畢,在執行隊列任務(異步)。不斷這樣循環執行。
node非阻塞I/O模型:將循環查看是否有任務隊列(其餘線程)中是否有任務等待;異步I/O。javascript

同步和異步任務

同步任務:主線程將代碼一步步執行下來,須要等待。
異步任務:引擎會將異步代碼放在另任務隊列中,等待同步的代碼執行完畢,才進行異步代碼的執行。java

異步實現的幾種模式

經過回調造成異步,

就是回調函數不須要等待主函數的結果纔會執行,不會影響主函數後面的代碼。列如ajax就是經過回調造成的異步,

eg:node

function f1(){
    console.log(1)
}
function f2(){
    console.log(2)
}
f1()
f2()
//上述代碼是同步的,因此f2須要f1執行完纔會執行。
//改爲異步,就是將f2改爲f1的回調。

function f1(){
    console.log(1)
}
function f2(){
    console.log(2)
}
f1(f2);
//f1(f2())

經過事件驅動

事件驅動機制,就是綁定一個事件,觸發該事件後才執行。列如,js的addEventListener、jquery的on()方法、定時器、jquery

//js
window.addEventListener("click",function(){
    alert(1111)
})
window.click();

//jquery
f1.on("success",f2)
function f1(){
    ajax(url,function(){
        f1.trigger("success")
    })
}
//jquery
f1.on("done",f2);
function f1(){
    setTimeout(function(){
        f1.triggle("success");
    },1000)
}

//定時器
var num=1;
setTimeout(function f2(){
    num++;
    console.log(num);
}) 
console.log(num);

結論:能夠綁定多個監聽事件;造成多個回調,利於模塊化。可是因爲事件驅動,因此很難看出主流程。es6

發佈/訂閱

事件徹底能夠理解爲「信號」,若是存在一個「信號中心」,某個任務執行完成,就向事件中心」發佈「。其餘任務則向」信號中心「詢問狀況。從而知道何時本身能夠開始。ajax

//利用jquery的插件實現
//首先,f2向消息中心訂閱success事件
jQuery.subscribe('success',f2);
//對f1進行改寫:
function f1(){
    ajax(url,() => {
        //todo
        jQuery.publish('success');//當f1執行完畢後,向消息中心jQuery發佈success事件,從而執行f2函數
    })
}
//f2執行完畢後,能夠取消訂閱
jQuery.unsubscribe('success',f2)

Promise

es6語法異步

異步的流程控制

串行

並行

串,並行結合

相關文章
相關標籤/搜索