JS異步編程方案,可以說在咱們日常前端開發工作中很常見的,首先我們得深入理解其原理,才能更好的去使用
我們都知道 JS是單線程的,所謂的單線程,就是一次只能執行一個任務,后面的任務只能排隊等待,這樣的弊端很明顯,會阻塞后面的代碼執行,造成頁面卡在這個地方,其他任務無法執行。
為了解決這個問題,js語言將任務又分為兩種執行模式: 同步和異步。
什么是同步?
所謂的同步就是在執行某段代碼時,在該代碼沒有得到返回結果之前,其他代碼暫時是無法執行的,但是一旦執行完成拿到返回值之后,就可以執行其他代碼了
什么是異步?
所謂異步就是當某一代碼執行異步過程調用發出后,這段代碼不會立刻得到返回結果。而是在異步調用發出之后,一般通過回調函數處理這個調用之后拿到結果。異步調用發出后,不會影響阻塞后面的代碼執行,這樣的情形稱為異步。
JS實現異步編程的方式有哪些?
好了,接下來我們說下有哪些方式可以實現異步編程。
回調函數
使用回調函數是一個最最最常見的一種編碼方式,但是它也有一個弊端,就是容易產生回調地獄。
baseRequst.request('paramsA',function(res){
baseRequst.request('paramsB',function(res){
baseRequst.request('paramsC',function(res){
//```````
})
})
})
上面的代碼邏輯就是接口請求先調用A,獲取到A接口返回的數據 然后再去請求B接口,等待B接口返回數據再去請求C.上面的代碼很容易就行程了回調地獄,容易行程回調地獄的場景也有很多,比如:
1 ajax請求的回調
2. 定時器的回調
3. 事件回調
4.node.js中的一些方法回調
異步回調如果嵌套的層級較多,就會大大的降低代碼的可讀性和維護性
promise
為了解決地獄回調問題,之后社區就推出了Promise的解決方案
function request(url,params) {
return new Promise((resolve, reject) => {
baseRequst.request(url,params,function(res){
resolve(data);
})
});
}
request(urlA,paramsA).then(data => {
return request(urlB,paramsB);
}).then(data => {
return request(urlC,paramsC);
}).then(data => {
return request(urlD,paramsD);
}).catch(reason => {
console.log(reason);
});
從上面代碼上看,針對回調地獄有個很好的改進,代碼的可讀性上也有一定的提升,但是依舊不夠優秀,所以又推出了promise.all方案
function request(url,params) {
return new Promise((resolve, reject) => {
baseRequst.request(url,params,function(res){
resolve(data);
})
});
}
// 通過 Promise.all 可以實現多個異步并行執行,同一時刻獲取最終結果的問題
Promise.all([request(urlC,paramsB), request(urlB,paramsB), request(urlC,paramsC)]).then(data => {
console.log(data);
}).catch(err =>
console.log(err)
);
這樣改造之后是不是比上面直接使用 Promise 來實現,看起來更清晰一目了然了