成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端中的進(jìn)程、線程、事件系統(tǒng)

用戶84 / 1324人閱讀

摘要:一瀏覽器的進(jìn)程和線程前端研發(fā)人員不要忘記了瀏覽器是安裝在電腦手機(jī)上的應(yīng)用。附錄中的事件系統(tǒng)環(huán)境中的事件系統(tǒng)多了兩個(gè)和案例四輸出結(jié)果

一、瀏覽器的進(jìn)程和線程

??????前端研發(fā)人員不要忘記了瀏覽器是安裝在PC電腦(手機(jī))上的應(yīng)用。既然是客戶端應(yīng)用,就免不了一個(gè)問題:線程和進(jìn)程。

一個(gè)程序可以有多個(gè)進(jìn)程;

一個(gè)進(jìn)程和多個(gè)線程;

多個(gè)進(jìn)程之間可以相互通信;

多個(gè)線程之間可以相互通信;

不同進(jìn)程之間的線程不能相互通信。

??????好,知道了這些基本的知識(shí),我們來看一下瀏覽器(以谷歌瀏覽器為例)這個(gè)最基本的應(yīng)用程序有哪些進(jìn)程,又有哪些線程。
Chrome的進(jìn)程:大家可以打開任務(wù)管理器看看,有哪些進(jìn)程

??????從圖中可以看到,在chrome中每打開一個(gè)標(biāo)簽頁,每一個(gè)擴(kuò)展程序都是一個(gè)進(jìn)程。
Chrome的線程:對于一個(gè)進(jìn)程來說,又有哪些線程呢?

GUI 渲染線程

JavaScript引擎線程

定時(shí)觸發(fā)器線程

事件觸發(fā)線程

異步http請求線程

??????那么當(dāng)你打開一個(gè)頁面,就啟動(dòng)了一個(gè)進(jìn)程,那么這個(gè)進(jìn)程有上面幾個(gè)線程。這幾個(gè)線程之間相互合作,但是GUI和JavaScript之間是相互獨(dú)立的,而且Javascript是單線程的。原因很簡單,涉及UI操作的不能同時(shí)處理,不然給用戶呈現(xiàn)的頁面會(huì)是什么樣子。
??????既然知道了,瀏覽器作為應(yīng)用程序具備的基本要素。那么我們想看看瀏覽器內(nèi)部具體的工作方式。
了解一個(gè)程序,首先了解程序的模塊劃分和工作流程。
瀏覽器主要?jiǎng)澐诌@幾個(gè)模塊瀏覽器部件:那么這幾個(gè)部件相互耦合,為用戶提供頁面。

1、用戶界面

2、瀏覽器引擎

3、渲染引擎

4、網(wǎng)絡(luò)

5、用戶界面后端

6、Javascript解釋器

7、數(shù)據(jù)持久化存儲(chǔ)

二、瀏覽器頁面渲染的方式(頁面初始化)
我們重點(diǎn)來看一下瀏覽器的渲染是怎么操作的

三、瀏覽器的事件系統(tǒng)(頁面操作)Macro和Micro


異步并不是不執(zhí)行,而是執(zhí)行放入隊(duì)列。

四、案例(可能是你們最想看的)
//案例一:
setTimeout(() => {
    console.log(promise);
    console.log("settimeout1");
  }, 0);
let promise = new Promise(function(resolve, reject) {
    console.log("Promise");
    setTimeout(()=>{
        resolve("success");
    },0);
    //resolve("success");
  }).then((msg)=>{
    console.log("resolved."+msg);
  });
  
  setTimeout(() => {
    console.log(promise);    
    console.log("settimeout2");
}, 0);
  console.log(promise);
  console.log("Hi!");
//輸出結(jié)果
Promise                //Promise會(huì)立即執(zhí)行
Promise {  }  //此時(shí)promise狀態(tài)為pending
Hi!                    //打印hi
Promise {  }  
settimeout1            //主線程執(zhí)行完畢,依次將三個(gè)settimeout放入macro隊(duì)列中,打印第一個(gè)
Promise {  }
settimeout2            //打印第二個(gè)
resolved.success       //promise執(zhí)行成功

//案例二:

如果promise中直接resolve("success"),運(yùn)行結(jié)果是怎么樣?
Promise
Promise {  }
Hi!
resolved.success
Promise { undefined }
settimeout1
Promise { undefined }
settimeout2

//案例三:

如果在React中的事件系統(tǒng)是什么樣子的呢?
class Father extends Component {
  render() {
    let promise = new Promise(function(resolve, reject) {
      resolve("success1");
    }).then((msg)=>{
      console.log("resolved."+msg);
    });
    return (
      
    );
  }
  componentDidMount(){
    console.log("Did Mount");
  }
  componentWillMount(){
    let promise = new Promise(function(resolve, reject) {
      resolve("success2");
    }).then((msg)=>{
      console.log("resolved."+msg);
    });
    console.log("Will Mount");
  }
}

//輸出結(jié)果
Will Mount
Did Mount
resolved.success2
resolved.success1
可以看到react并沒有將micro任務(wù)合并到渲染里面

為什么會(huì)提及React,因?yàn)镽eact 的處理方式和我們和瀏覽器的實(shí)現(xiàn)流程比較類似。
React初始化《======》瀏覽器初始加載
React更新 ??《======》瀏覽器的事件系統(tǒng)
所以React從很大程度上做了一層抽象,讓我們面向組件的函數(shù)編程,而不是面向?yàn)g覽器的編程。

附錄:Node中的事件系統(tǒng)Node

node環(huán)境中的事件系統(tǒng)多了兩個(gè) process.nextTick和setImmediate

//案例四:
setTimeout(() => {
    console.log(promise);
    console.log("settimeout1");
  }, 0);
let promise = new Promise(function(resolve, reject) {
    console.log("Promise");
    /*setTimeout(()=>{
        resolve("success");
    },0);*/
    resolve("success");
  }).then((msg)=>{
    console.log("resolved."+msg);
  });
  
  setTimeout(() => {
    console.log(promise);    
    console.log("settimeout2");
}, 0);
console.log(promise);
console.log("Hi!");
process.nextTick(()=>{console.log("nextTick")});
setImmediate(()=>{console.log("Immediate")}) ;
//輸出結(jié)果
Promise
Promise {  }
Hi!
nextTick
resolved.success
Promise { undefined }
settimeout1
Promise { undefined }
settimeout2
Immediate

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96719.html

相關(guān)文章

  • 深入前端-徹底搞懂JS的運(yùn)行機(jī)制

    摘要:瀏覽器是多進(jìn)程的詳情看我上篇總結(jié)瀏覽器執(zhí)行機(jī)制的文章深入前端徹底搞懂瀏覽器運(yùn)行機(jī)制瀏覽器每打開一個(gè)標(biāo)簽頁,就相當(dāng)于創(chuàng)建了一個(gè)獨(dú)立的瀏覽器進(jìn)程。執(zhí)行異步操作事件完成,回調(diào)函數(shù)進(jìn)入。主線程從讀取回調(diào)函數(shù)并執(zhí)行。 最近看了很多關(guān)于JS運(yùn)行機(jī)制的文章,每篇都獲益匪淺,但各有不同,所以在這里對這幾篇文章里說的很精辟的地方做一個(gè)總結(jié),參考文章鏈接見最后。本文博客地址 了解進(jìn)程和線程 進(jìn)程是應(yīng)用...

    luckyw 評論0 收藏0
  • 深入前端-徹底搞懂JS的運(yùn)行機(jī)制

    摘要:瀏覽器是多進(jìn)程的詳情看我上篇總結(jié)瀏覽器執(zhí)行機(jī)制的文章深入前端徹底搞懂瀏覽器運(yùn)行機(jī)制瀏覽器每打開一個(gè)標(biāo)簽頁,就相當(dāng)于創(chuàng)建了一個(gè)獨(dú)立的瀏覽器進(jìn)程。執(zhí)行異步操作事件完成,回調(diào)函數(shù)進(jìn)入。主線程從讀取回調(diào)函數(shù)并執(zhí)行。 最近看了很多關(guān)于JS運(yùn)行機(jī)制的文章,每篇都獲益匪淺,但各有不同,所以在這里對這幾篇文章里說的很精辟的地方做一個(gè)總結(jié),參考文章鏈接見最后。本文博客地址 了解進(jìn)程和線程 進(jìn)程是應(yīng)用...

    jaysun 評論0 收藏0
  • 大話javascript 4期:事件循環(huán)(1)

    摘要:腳本執(zhí)行,事件處理等。引擎線程,也稱為內(nèi)核,負(fù)責(zé)處理腳本程序,例如引擎。事件觸發(fā)線程,用來控制事件循環(huán)可以理解為,引擎線程自己都忙不過來,需要瀏覽器另開線程協(xié)助。異步請求線程,也就是發(fā)出請求后,接收響應(yīng)檢測狀態(tài)變更等都是這個(gè)線程管理的。 一、進(jìn)程與線程 現(xiàn)代操作系統(tǒng)比如Mac OS X,UNIX,Linux,Windows等,都是支持多任務(wù)的操作系統(tǒng)。 什么叫多任務(wù)呢?簡單地說,就是操...

    codergarden 評論0 收藏0
  • 從瀏覽器多進(jìn)程到JS單線程,JS運(yùn)行機(jī)制最全面的一次梳理

    摘要:如果看完本文后,還對進(jìn)程線程傻傻分不清,不清楚瀏覽器多進(jìn)程瀏覽器內(nèi)核多線程單線程運(yùn)行機(jī)制的區(qū)別。因此準(zhǔn)備梳理這塊知識(shí)點(diǎn),結(jié)合已有的認(rèn)知,基于網(wǎng)上的大量參考資料,從瀏覽器多進(jìn)程到單線程,將引擎的運(yùn)行機(jī)制系統(tǒng)的梳理一遍。 前言 見解有限,如有描述不當(dāng)之處,請幫忙及時(shí)指出,如有錯(cuò)誤,會(huì)及時(shí)修正。 ----------超長文+多圖預(yù)警,需要花費(fèi)不少時(shí)間。---------- 如果看完本文后,還...

    wanghui 評論0 收藏0
  • 瀏覽器進(jìn)程線程1

    摘要:瀏覽器的渲染進(jìn)程是多線程的。因此為了防止渲染出現(xiàn)不可預(yù)期的結(jié)果,瀏覽器設(shè)置渲染線程與引擎為互斥的關(guān)系,當(dāng)引擎執(zhí)行時(shí)線程會(huì)被掛起,更新則會(huì)被保存在一個(gè)隊(duì)列中等到引擎線程空閑時(shí)立即被執(zhí)行。 本篇文章參考自撒網(wǎng)要見魚大佬的 僅供自己學(xué)習(xí)提升。 https://segmentfault.com/a/11... 區(qū)分線程和進(jìn)程 **- 什么是進(jìn)程** 狹義定義:進(jìn)程是正在運(yùn)行的程序的實(shí)例(a...

    Forest10 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<