欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js面試題之異步問題的深入理解

 更新時(shí)間:2020年09月20日 09:39:27   作者:新西伯利亞狼  
這篇文章主要給大家介紹了關(guān)于js面試題之異步問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

js中的宏任務(wù)與微任務(wù)

在面試過程中,基本面試官都會(huì)問你一些promise的問題,promise是es6的新內(nèi)容,主要是用來優(yōu)化異步的問題。筆試中經(jīng)常會(huì)讓你寫一些promise和setTimeout的執(zhí)行結(jié)果,這你就必須知道宏任務(wù)和微任務(wù)的概念了!

為什么要使用promise

如果你經(jīng)歷過以前的jquery開發(fā)項(xiàng)目,你會(huì)遇到以下問題:回調(diào)地獄

$.ajax({
	...
	success: function() {
		...
		$.ajax({
			...
			success: function() {
				
			}
		})
		...
	}
})

原因分析:

ajax請求嵌套,原因是我第二個(gè)請求依賴的參數(shù)在第一個(gè)請求的結(jié)果中,所以就得這么一直嵌套下去,ajax是異步的,不能再外面拿到里面的結(jié)果。這種代碼導(dǎo)致的問題就是調(diào)試?yán)щy,耦合性非常高,后期改動(dòng)一個(gè)地方就頭疼!維護(hù)非常困難,代碼可讀性差。

于是乎就引入了promise對ajax進(jìn)行了優(yōu)化,axios就是基于promise的一個(gè)請求封裝庫,他們底層都是基于js原生的XMLHTTPREQUEST.

promise().then().catch()鏈?zhǔn)秸{(diào)用,多個(gè)請求可以promise().then().then()。

何為宏任務(wù),何為微任務(wù)?

思考這個(gè)問題時(shí)你必須知道javascript是一種單線程的腳本語言,也就是它的代碼正常只能從上往下依次執(zhí)行,一次只能做一件事,異步是通過回調(diào)函數(shù)來實(shí)現(xiàn)的。為何不把js設(shè)計(jì)成多線程的語言呢?語言的用途決定了它的特性,js最初是用來做表單驗(yàn)證以及正則判斷的,和操作DOM元素的。如果js有多個(gè)線程,一個(gè)執(zhí)行DOM元素修改,另一個(gè)執(zhí)行刪除,那瀏覽器直接懵逼了,我到底該干啥???所以語言的用途決定了他的特性,但是瀏覽器是多線程的,除了主線程還有其他線程。

當(dāng)js主程序執(zhí)行時(shí),先運(yùn)行主程序上的同步代碼,遇到setTimeout或setInterval就把它放入宏隊(duì)列中,遇到promise的回調(diào)就把它放到微隊(duì)列中,程序執(zhí)行先執(zhí)行主程序代碼,再執(zhí)行nextTick代碼,然后微任務(wù),最后宏任務(wù),任務(wù)隊(duì)列中的依次排隊(duì)執(zhí)行,async和await是配套使用的,await后面接一個(gè)promise對象,來看看下面這段代碼:

 setTimeout(function(){console.log(1)},0); // 進(jìn)入宏任務(wù)隊(duì)列,最后執(zhí)行宏任務(wù)
 new Promise(function(resolve,reject){
   console.log(2); //這句代碼在promise構(gòu)造器,同步執(zhí)行
   resolve(); // 執(zhí)行了resolve再把任務(wù)放入微隊(duì)列
 }).then(function(){console.log(3)
 }).then(function(){console.log(4)});
 process.nextTick(function(){console.log(5)});
 console.log(6); // 主程序代碼
 // 輸出2,6,5,3,4,1
 
// 下面這個(gè)進(jìn)階代碼
setTimeout(function(){console.log(1)},0); // 進(jìn)入宏任務(wù)排序?yàn)?
new Promise(function(resolve,reject){
   console.log(2);
   // promise中執(zhí)行完resolve()才會(huì)執(zhí)行then(),而這里的resolve在宏任務(wù)里,執(zhí)行完主程序代碼后,還得先執(zhí)行先進(jìn)入宏隊(duì)列中的程序
   setTimeout(function(){resolve()},0) // 進(jìn)入宏任務(wù)排序?yàn)?
 }).then(function(){console.log(3)
 }).then(function(){console.log(4)});
 process.nextTick(function(){console.log(5)});
 console.log(6);
 // 輸出的是 2 6 5 1 3 4

再看async and await中的執(zhí)行順序

代碼如下(示例):

async function async1() {
  console.log(1); 
  await async2();
  console.log(2); //這里要等await執(zhí)行成功才會(huì)執(zhí)行,進(jìn)入微任務(wù),排序1
}
async function async2() {
  console.log(3);
}
console.log(4); //主程序代碼
setTimeout(function() {
  console.log(5);
}, 0) //進(jìn)入宏任務(wù),最后執(zhí)行
async1();
new Promise(function(resolve) {
  console.log(6); // 這句同步執(zhí)行
  resolve(); 
}).then(function() {
  console.log(7); //進(jìn)入微任務(wù),排序2
});
console.log(8); // 主程序代碼
// 輸出的是 4,1,3,6,8,2,7,5

總結(jié)

js是單線程語言,它的用途決定了他的特性,異步操作通過事件循環(huán)機(jī)制,先執(zhí)行同步代碼,然后微任務(wù),最后宏任務(wù),兩個(gè)任務(wù)隊(duì)列里的任務(wù)排隊(duì)依次執(zhí)行。await后面的代碼必須等待promise返回結(jié)果再執(zhí)行下面代碼,await和async是generator函數(shù)的語法糖。

到此這篇關(guān)于js面試題之異步問題的文章就介紹到這了,更多相關(guān)js面試題之異步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • canvas仿iwatch時(shí)鐘效果

    canvas仿iwatch時(shí)鐘效果

    本文主要介紹了canvas仿iwatch時(shí)鐘效果的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • WebPack工具運(yùn)行原理及入門教程

    WebPack工具運(yùn)行原理及入門教程

    這篇文章主要介紹了WebPack工具運(yùn)行原理及入門教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 微信小程序點(diǎn)擊保存圖片到本機(jī)功能

    微信小程序點(diǎn)擊保存圖片到本機(jī)功能

    這篇文章主要介紹了微信小程序點(diǎn)擊保存圖片到本機(jī)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Angular?服務(wù)器端渲染緩存功能問題

    Angular?服務(wù)器端渲染緩存功能問題

    這篇文章主要介紹了Angular服務(wù)器端渲染緩存功能問題,內(nèi)存緩存可用于應(yīng)用程序本身的渲染頁面和API請求。?兩種使用場合都通過開發(fā)包@ngx-ssr或cache提供
    2022-06-06
  • 深入理解ES6的迭代器與生成器

    深入理解ES6的迭代器與生成器

    本篇文章主要介紹了深入理解ES6的迭代器與生成器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • 原生js實(shí)現(xiàn)輪播圖

    原生js實(shí)現(xiàn)輪播圖

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)輪播圖的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 微信小程序?qū)崿F(xiàn)搜索歷史功能

    微信小程序?qū)崿F(xiàn)搜索歷史功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)搜索歷史功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • JavaScript判斷當(dāng)前時(shí)間是在某個(gè)時(shí)間點(diǎn)之前/之后

    JavaScript判斷當(dāng)前時(shí)間是在某個(gè)時(shí)間點(diǎn)之前/之后

    本文主要介紹了JavaScript判斷當(dāng)前時(shí)間是在某個(gè)時(shí)間點(diǎn)之前/之后,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 分享15個(gè)JavaScript的重要數(shù)組方法

    分享15個(gè)JavaScript的重要數(shù)組方法

    這篇文章主要介紹了分享15個(gè)JavaScript的重要數(shù)組方法,數(shù)組方法的重要一點(diǎn)是有些是可變的,有些是不可變的。在決定針對特定問題使用哪種方法時(shí),務(wù)必牢記,下文就來分享重要數(shù)組方法,需要的小伙伴可以參考一下
    2022-05-05
  • 微信小程序自定義彈窗wcPop插件

    微信小程序自定義彈窗wcPop插件

    平時(shí)在開發(fā)小程序的時(shí)候,彈窗應(yīng)用場景還是蠻廣泛的,但是微信官方提供的彈窗比較有局限性,不能自定義修改。下面通過本文給大家?guī)砹宋⑿判〕绦蜃远x彈窗wcPop插件,感興趣的朋友跟隨小編一起看看吧
    2018-11-11

最新評論