setTimeout 对比 WebWorker 对比 XMLHttpRequest
setTimeout vs WebWorker vs XMLHttpRequest
我需要更清楚地理解这些概念,因为我不确定它们。
Javascript 是单线程的,到目前为止,还不错。
根据我的理解,setTimeout只是延迟了主线程代码的执行,但是当调用堆栈为空时,回调仍然在主线程上执行。这个对吗? Promises 和事件处理程序也是如此。
setTimeout(() => {
console.log('this line of code is executed on the main thread');
}, 5000);
对于使用 XMLHttpRequest 的异步请求,实际请求被发送到一个单独的 API ,由在单独线程上运行它的浏览器实现,因此,它是真正异步的。这是正确的吗?
WebWorkers 将是浏览器实现的另一个 API,它也在后台线程中运行来自给定脚本的代码。这是正确的吗?
如果能回答这个问题,我将不胜感激!
您在所有三点上大体上都是正确的。
- 设置超时和任何其他异步函数在先决条件完成时排队等待执行。因此,当调用堆栈为空并且有工作要做时,JS 会选择下一个排队的函数并执行它。这由所谓的 javascript 事件队列处理。
- 与 setTimeout 没有太大的实际区别。一旦完成,这两个函数都会对您的回调进行排队,负责实现的代码已定义,因此浏览器可以选择就多线程而言如何执行。
- 是的,worker 运行在另一个线程中并且有自己的事件循环。如果它向主线程发送消息,则该消息的回调与该消息一起排队到主线程中的 运行,反之亦然。请注意,据我所知,Web 浏览器没有义务为每个工作人员提供一个线程,但这不会以任何方式影响您。
我需要更清楚地理解这些概念,因为我不确定它们。 Javascript 是单线程的,到目前为止,还不错。
根据我的理解,setTimeout只是延迟了主线程代码的执行,但是当调用堆栈为空时,回调仍然在主线程上执行。这个对吗? Promises 和事件处理程序也是如此。
setTimeout(() => { console.log('this line of code is executed on the main thread'); }, 5000);
对于使用 XMLHttpRequest 的异步请求,实际请求被发送到一个单独的 API ,由在单独线程上运行它的浏览器实现,因此,它是真正异步的。这是正确的吗?
WebWorkers 将是浏览器实现的另一个 API,它也在后台线程中运行来自给定脚本的代码。这是正确的吗?
如果能回答这个问题,我将不胜感激!
您在所有三点上大体上都是正确的。
- 设置超时和任何其他异步函数在先决条件完成时排队等待执行。因此,当调用堆栈为空并且有工作要做时,JS 会选择下一个排队的函数并执行它。这由所谓的 javascript 事件队列处理。
- 与 setTimeout 没有太大的实际区别。一旦完成,这两个函数都会对您的回调进行排队,负责实现的代码已定义,因此浏览器可以选择就多线程而言如何执行。
- 是的,worker 运行在另一个线程中并且有自己的事件循环。如果它向主线程发送消息,则该消息的回调与该消息一起排队到主线程中的 运行,反之亦然。请注意,据我所知,Web 浏览器没有义务为每个工作人员提供一个线程,但这不会以任何方式影响您。