91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs中怎么循環瀏覽器事件

發布時間:2021-07-08 16:07:51 來源:億速云 閱讀:150 作者:Leah 欄目:大數據

nodejs中怎么循環瀏覽器事件,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

第一章:事件循環介紹:
  • 瀏覽器中的事件循環:

    • 為了協調事件(event),用戶交互(user interaction),腳本(script),渲染(rendering),網絡(networking)等,用戶代理(user agent)必須使用 事件循環(event loops).

    • 事件:PostMessage(多個頁面通信),MutationObserver(dom監聽)等

    • 用戶交互:click,onScroll等

    • 渲染:解析dom,css等

    • 腳本:執行腳本

  • nodejs中的事件循環

    • 事件循環允許Node.js執行非阻塞I/O操作,盡管JavaScript是單線程的,通過盡可能將操作卸載到系統內核,由于大多數現代內核都是多線程的,因此 他們可以處理在后臺執行的多個操作。當其中一個操作完成時,內核會告訴Nodejs,以便可以將相應的回調添加到輪詢隊列中以最終執行。

    • 事件:EventEmitter

    • 非阻塞I/O: 網絡請求,文件讀寫等

    • 腳本: js執行腳本

  • 事件循環的本質

    • 在瀏覽器或者nodejs環境中,運行時對js腳本的調度方式就叫事件循環

setTimeout(()=>{
    console.log('setTimeout')
},0)
Promise.resolve().then(() =>{
    console.log('promise')
})
console.log('main')
// main  promise  setTimeout
第二章:瀏覽器事件循環
  • javascript為什么是單線程的?

    • 瀏覽器js的作用是操作DOM,這決定了它只能是單線程,否則會帶來很復雜的同步問題。比如,假定javascript同時有兩個線程,一個線程在某個DOM 節點上添加內容,另一個線程刪除了這個節點,這時瀏覽器不知道以哪個線程為主。

  • 任務隊列

    • 單線程意味著所有任務需要排隊,如果因為任務cpu計算量大還好,但是I/O操作cpu是閑著的。所以js就設計成了一門異步語言,不會做無謂的等待。

    • 任務可以分成兩種,一種是同步任務,另一種是異步任務。

    • 所有同步任務都在主線程上執行,形成一個執行棧。

    • 主線程之外,還存在一個任務隊列。只要異步任務有了運行結果,就在任務隊列之中放置一個事件。

    • 一旦執行棧中的所有同步任務執行完畢,系統就會讀取任務隊列,看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。

    • 主線程不斷重復上面的第三步

    • 主線程從任務隊列中讀取事件,這個過程是循環不斷的,所以整個的這種運行機制又稱 Event Loop(事件循環)

  • 宏任務和微任務

    • 除了廣義的同步任務和異步任務,javaScript單線程中的任務可以細分為 宏任務和微任務。

    • macrotask(宏任務): script(整體代碼),setTimeout, setInterval, setImmediate, I/O, UI rendering

    • microtask(微任務):process.nextTick, Promise, Object.observe, MutationObserver 1.宏任務進入主線程,執行過程中會搜集微任務加入微任務隊列。 2.宏任務執行完成之后,立馬執行微任務中的任務。微任務執行過程中將再次收集宏任務,并加入宏任務隊列 3.反復執行1,2

  • 事件循環:每執行完一輪宏任務和微任務就叫做一環事件;

高頻面試題
  • 一輪事件循環會執行一次宏任務以及所有的微任務

setTimeout(() => {
    console.log('setTimeout')
    setTimeout(() => {
       console.log('setTimeout2')
    },0)
},0)

Promise.resolve().then(() =>{
    console.log('Promise')
    Promise.resolve().then(() =>{
      console.log('Promise2')
    })
})

console.log('main')
// main  promise promise2 setTimeout
  • 任務隊列一定會保持先進先出的順序執行,沒次只能執行一個紅任務!!!·

setTimeout(() => { // 兩個setTimeout誰先進的話 誰就先出
    console.log('setTimeout')
    Promise.resolve().then(() =>{
      console.log('promise')
    })
},0)

Promise.resolve().then(() =>{
    console.log('promise2')
    setTimeout(() => {
       console.log('setTimeout2')
    },0)
})

console.log('main')
// main promise2 setTimeout  promise  setTimeout2
new Promise((res, rej) =>{
    console.log(1)
    res()
  }).then(() =>{
    console.log(2)
    new Promise((res,rej) =>{
      console.log(3)
      res()
    }).then(() =>{
      console.log(4)
    }).then(() =>{
      console.log(5)
    }).then(() =>{
      console.log(6)
    })
  }).then(() =>{
      console.log(7)
    })
    .then(() =>{
      console.log(8)
    })
// 1 2 3 4 7 5 8 6

看完上述內容,你們掌握nodejs中怎么循環瀏覽器事件的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

仁怀市| 汪清县| 房产| 彰武县| 鄱阳县| 鹿邑县| 清远市| 广水市| 潞城市| 个旧市| 新民市| 华阴市| 兴山县| 邛崃市| 海安县| 龙里县| 海兴县| 色达县| 崇信县| 和林格尔县| 大方县| 育儿| 定州市| 桓台县| 玉树县| 兴和县| 江源县| 宿松县| 克山县| 上高县| 贵港市| 临湘市| 保德县| 平遥县| 丽江市| 甘南县| 丘北县| 海南省| 辽宁省| 炎陵县| 加查县|