Javascript 在调用堆栈为空后,是否只有一些spefiic回调在NodeJ的事件循环中处理?

Javascript 在调用堆栈为空后,是否只有一些spefiic回调在NodeJ的事件循环中处理?,javascript,node.js,asynchronous,callback,asynchronous-javascript,Javascript,Node.js,Asynchronous,Callback,Asynchronous Javascript,您好,我是Node.js新手,很难理解回调、回调队列以及如何处理回调。我的问题是什么样的回调会进入节点中的回调队列?它是否必须是特定于节点的API、npm包和web API(如setTimeOut、request())中的回调,才能添加到回调队列中,以便在主调用堆栈为空后执行?或者任何类型的回调都会进入node.js中的回调队列?node.js中的任何事件驱动项最终都会有一些代码在将来某个时间将回调插入事件队列。这可以是内置项,如setTimeout(),setInterval(),通过net模

您好,我是Node.js新手,很难理解回调、回调队列以及如何处理回调。我的问题是什么样的回调会进入节点中的回调队列?它是否必须是特定于节点的API、npm包和web API(如setTimeOut、request())中的回调,才能添加到回调队列中,以便在主调用堆栈为空后执行?或者任何类型的回调都会进入node.js中的回调队列?

node.js中的任何事件驱动项最终都会有一些代码在将来某个时间将回调插入事件队列。这可以是内置项,如
setTimeout()
setInterval()
,通过
net
模块联网,通过
fs
模块异步文件I/O等。。。或者,它也可以是使用附加组件API的本机代码附加组件,触发事件并将回调插入事件队列。这是node.js中未来某个时候发生的任何异步事件如何工作的关键。每个异步操作都使用相同的机制

事件循环实际上相当复杂,包含一系列不同类型的队列。有一个用于I/O,有一个用于计时器,有一个用于承诺。它们有不同的优先级和一定的顺序。例如,承诺比其他类型的事件具有更高的优先级。计时器实际上与其他计时器的工作方式有点不同,但从逻辑上讲,您仍然可以将它们视为一组计时器,当触发时,它们会导致调用回调

除计时器外,当需要触发事件时,某些本机代码会将回调插入事件队列的适当部分。当事件循环转到特定类型的事件时,它将调用与该事件关联的回调,并执行与该回调关联的Javascript。当该回调返回时,它将继续在事件循环中寻找其他要运行回调的事件。如果没有找到任何可以启动的东西,它将一直休眠,直到有东西插入事件队列或下一个计时器准备启动


计时器使用排序的链表,下一个计时器位于链表的前面。事件循环只是将当前系统时间与列表前面计时器的触发时间进行比较。如果在事件循环开始检查计时器时触发该事件(或超过计时器),则执行与该计时器关联的回调,并将其从链接列表中删除。如果没有,事件循环将转移到其他类型的事件。

node.js中的任何事件驱动项最终都有一些代码,可以在将来某个时间在事件队列中插入回调。这可以是内置项,如
setTimeout()
setInterval()
,通过
net
模块联网,通过
fs
模块异步文件I/O等。。。或者,它也可以是使用附加组件API的本机代码附加组件,触发事件并将回调插入事件队列。这是node.js中未来某个时候发生的任何异步事件如何工作的关键。每个异步操作都使用相同的机制

事件循环实际上相当复杂,包含一系列不同类型的队列。有一个用于I/O,有一个用于计时器,有一个用于承诺。它们有不同的优先级和一定的顺序。例如,承诺比其他类型的事件具有更高的优先级。计时器实际上与其他计时器的工作方式有点不同,但从逻辑上讲,您仍然可以将它们视为一组计时器,当触发时,它们会导致调用回调

除计时器外,当需要触发事件时,某些本机代码会将回调插入事件队列的适当部分。当事件循环转到特定类型的事件时,它将调用与该事件关联的回调,并执行与该回调关联的Javascript。当该回调返回时,它将继续在事件循环中寻找其他要运行回调的事件。如果没有找到任何可以启动的东西,它将一直休眠,直到有东西插入事件队列或下一个计时器准备启动


计时器使用排序的链表,下一个计时器位于链表的前面。事件循环只是将当前系统时间与列表前面计时器的触发时间进行比较。如果在事件循环开始检查计时器时触发该事件(或超过计时器),则执行与该计时器关联的回调,并将其从链接列表中删除。如果没有,事件循环将转移到其他类型的事件。

请记住回调和回调队列是两个独立的东西,它们没有任何特定的关系。那么,在主调用堆栈为空之后,回调队列内部将处理什么呢?甚至是受驱动的回调吗?看看这个,这可能会帮助你理解这一点。如果到目前为止您还没有了解,请告诉我。是的,但我仍然不明白的是,是的setTimeOut是一个异步函数,有时会在之后执行,因此它有事件以及与之关联的回调,这些事件以及回调被添加到事件队列和回调队列中……除此之外,所有npm包(如request())是否,他们都去回叫队列了吗?我仍然不清楚什么样的回调实际上会进入回调队列,稍后再进行处理…..是否只有事件驱动的回调(如setTimeOut(回调,duration)和npm包(如request())会被添加到回调队列中?实际上,据我所知,下的每个操作都会被添加到回调队列中,只要有人来就跑
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)
      
   }

})
}