【问题标题】:How does javascript engine know when network request is complete?javascript引擎如何知道网络请求何时完成?
【发布时间】:2021-08-15 07:55:00
【问题描述】:

我理解 Promise 的概念,异步任务在完成后使用 resolve 函数解决。 经典的例子是:

const futureValue = new Promise(resolve => {
    setTimeout(() => {
        resolve("some value... tutorials pretend there's an API response here")
    }, 1000)
})

之后,就可以这样使用了:

futureValue.then(r => { 
    // ... do stuff with the response 
})

或在异步函数中:

async () => {
    const response = await futureValue
    // ... do stuff with the response
}

我的问题是,鉴于 Javascript 知道哪些任务是异步的并且需要放在事件循环中,事件循环如何知道不受其控制的任务何时完成?

更清楚地说,在setTimeout 的情况下,Javascript 是对setTimeout 进行计数的,所以它自然知道它何时完成并自行解析Promise。当涉及到网络请求时,我对内部机制感到困惑。它如何知道来自服务器的响应何时到达?只是问“你在吗?”一遍又一遍,直到响应为“是”,然后解决该响应?我想我错过了什么。

【问题讨论】:

  • 承诺在微任务队列中排队,每次滴答都会检查。我建议观看此视频以非常清楚地理解youtube.com/watch?v=cCOL7MC4Pl0
  • "javascript 是为 setTimeout 计数的"不,JS 不负责计时器,"javascript 引擎如何知道网络请求何时完成?",它不,JS引擎不知道网络请求是什么。请记住,浏览器不是用 JS 编写的,JS 是作为浏览器环境的一部分在各个地方执行的,尤其是在事件循环的几个步骤中(它本身也不是由 JS 驱动的),但它不是浏览器。没有 JS 引擎,你也可以拥有一个兼容的网络浏览器。

标签: javascript asynchronous es6-promise event-loop


【解决方案1】:

在这个答案中,我将 Javascript 视为一种浏览器语言,并忽略了它可能的服务器端用途。

事件循环可能会检查 setTimeout/setInterval 条件,具体取决于实现(每个浏览器都单独实现 Javascript,并且这些实现对于多个功能可能会有很大差异,包括这个),但请求的响应是浏览器事件,它最终涵盖了引擎盖下的网络事件。 Javascript 请求浏览器发送请求并要求得到通知。浏览器轮到它发出一个网络事件,并请求操作系统将其发送出去,一旦完成,它就会以自己的方式处理请求完成。

如果我要为浏览器实现 Javascript,那么浏览器会将响应推送到队列,并且 Javascript 的事件循环会在其事件循环中检查该队列。如果是空的,什么也不做。如果那里有一些事件,那么它会弹出并处理它,最终到达您的回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    相关资源
    最近更新 更多