【问题标题】:is there any difference between a method that takes long time to execute and the setTimeout function?需要很长时间执行的方法和 setTimeout 函数之间有什么区别吗?
【发布时间】:2020-07-29 09:55:01
【问题描述】:

我正在学习 JavaScript。我有个疑问。听说我们在使用setTimeout方法的时候,javascript会把那个setTimeout的回调函数从调用栈中移除,放到另一个调用栈上,继续执行当前调用栈。


function f1() {
  console.log("print first");
  setTimeout(() => {
    console.log("print in time out");
  }, 4000);
  console.log("print last");

}

这个函数的输出

先打印
最后打印
打印超时

因为setTimeOut的回调放入了一个新的栈中。

如果我使用 Ajax 请求或类似的东西需要一些时间来执行而不使用异步会怎样。像这样的。


function API(){
    const apiCALL = fetch('https://jsonplaceholder.typicode.com/posts');
    console.log(apiCALL);
}
 

这是否也放入另一个调用堆栈?

【问题讨论】:

  • 究竟什么是“需要很长时间才能执行的方法”?像while (true) {} 这样的东西?还是 AJAX 请求或类似的东西?
  • 是的,像 AJAX 先生
  • API 函数将立即结束执行并且不记录任何感兴趣的内容。 fetch 正在返回一个承诺,要获得承诺结果,您需要向其添加 .then 回调。此时它的行为与setTimeout 的情况相同。

标签: javascript settimeout callstack


【解决方案1】:

您必须知道的一件事是fetchsetTimeout 函数都不是真正的javascript 函数。它们属于 Window - Web APIs。你可以在这里阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Window

每当您使用这些函数时,它们都会从调用堆栈进入可能用 C# 或其他东西编写的窗口 api。一旦他们完成了他们应该做的事情,他们就会在一个回调队列中发回响应,你可以把它想象成一个不同的调用堆栈。

Javascript 本身是单线程的,但使用 window api 的函数可以异步运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 2019-07-28
    • 2014-05-12
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2011-04-22
    相关资源
    最近更新 更多