亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在調用堆棧為空后,是否只有一些特定的回調在 Nodejs 的事件循環中處理?

在調用堆棧為空后,是否只有一些特定的回調在 Nodejs 的事件循環中處理?

臨摹微笑 2022-10-21 10:56:37
1.const geoCode = (address, callback)=> {setTimeout(()=> { const data ={    longitude: 0,    latitude: 0}  callback(data)  }) }geoCode('John', (data)=>{ console.log(data) })2. const forecast =(longitude, latitude, callback) =>{   const url = `https://api.openweathermap.org/data/2.5/weather?    lat=${latitude}&lon=${longitude}&appid=ff894a55e90b66e3d6cd4b2bd8ea6509`   console.log(url);   request({url, json:true}, (error, {body})=>{   if(error) {      callback('Unable to connect to the Internet', undefined)   } else if(body.error){      callback('Please try again', undefined)   } else {      callback(undefined,body.main)         }})}嗨,我是 Node.js 的新手,很難理解回調、回調隊列及其處理方式。我的問題是,什么樣的回調會進入 Node 中的回調隊列?它是否必須是節點特定 APIS、npm 包和 web API(如 setTimeOut、request())內部的回調,才能添加到回調隊列中,以便在主調用堆棧為空后執行?或任何類型的回調進入 node.js 中的回調隊列?
查看完整描述

1 回答

?
森林海

TA貢獻2011條經驗 獲得超2個贊

node.js 中的任何事件驅動項最終都有一些代碼在將來的某個時間在事件隊列中插入回調。這可以是內置項目,如setTimeout(),,,通過模塊setInterval()聯網,通過net模塊異步文件 I/Ofs等......或者也可以是使用附加 API 的原生代碼附加組件,觸發事件和導致回調被插入到事件隊列中。這是未來某個時間發生的任何異步事件如何在 node.js 中工作的關鍵。每個異步操作都使用相同的機制。

事件循環實際上相當復雜,包含一堆不同類型的隊列。一個用于 I/O,一個用于定時器,一個用于 Promise。它們有不同的優先級和一定的順序。例如,Promise 比其他類型的事件具有更高的優先級。定時器實際上與其他定時器的工作方式略有不同,但您仍然可以在邏輯上將它們視為一組定時器,當它們被觸發時,它們會導致回調被調用。

除了定時器,當一個事件想要被觸發時,一些本地代碼會在某個地方插入一個回調到事件隊列的適當部分。當事件循環處理該特定類型的事件時,它將調用與該事件關聯的回調并執行與該回調關聯的 Javascript。當該回調返回時,它會繼續圍繞事件循環尋找其他事件來運行回調。如果沒有找到任何準備就緒的東西,它就會休眠,直到有東西被插入到事件隊列中或直到下一個計時器準備好觸發。

計時器使用排序鏈表,下一個計時器位于列表的前面。事件循環只是將當前系統時間與列表前面的計時器的觸發時間進行比較。如果當事件循環開始檢查計時器時該事件觸發的時間(或超過計時器),則執行與該計時器關聯的回調并將其從鏈接列表中刪除。如果不是,則事件循環繼續處理其他類型的事件。


查看完整回答
反對 回復 2022-10-21
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號