【发布时间】: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