javascript如何实现setTimout/setInterval和异步函数
我有一个关于设置超时的问题 为了理解我的观点,让我们举个例子:javascript如何实现setTimout/setInterval和异步函数,javascript,settimeout,setinterval,Javascript,Settimeout,Setinterval,我有一个关于设置超时的问题 为了理解我的观点,让我们举个例子: function f(callback) { var i = 0; while(true) { ++i; if(i == 2000000000) break; } callback(); } function g() { f(function(){console.log("CALLBACK");}); console.log("FIRST H
function f(callback)
{
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
callback();
}
function g()
{
f(function(){console.log("CALLBACK");});
console.log("FIRST HERE");
}
g();
console.log("SECOND HERE");
因此,正如我们所期望的,(即使代码在函数f
中具有异步风格的callback
),首先执行f
中的while循环,“callback”被打印,然后“first here”被打印,接着是“SECOND here”。此代码以同步方式运行,即使乍一看我们认为这是异步的,因为回调
函数传入f
现在让我们看另一个例子:
function f(callback)
{
setTimeout(function(){
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
callback();
});
}
function g()
{
f(function(){console.log("CALLBACK");});
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
console.log("FIRST HERE");
}
g();
console.log("SECOND HERE");
现在f
中的代码被封装在setTimeout
中。在这里,一切都在改变<代码>设置超时没有等待时间的第二个参数。因此,通常应该立即(尽快)执行代码。但是这里“FIRST here”和“SECOND here”是首先打印的,并且只有在打印之后(在f
中执行了所有while循环之后),才会执行setTimout
中的代码,然后打印“CALLBACK”。因此,我们可以观察到,即使现在应该执行f
中的代码,也只有在执行“main”代码结束时才会执行块(内部setTimout
)
我的问题是。javascript如何处理setTimeout
或setInterval
?在该示例中,我们观察到代码现在没有执行(或者在第二个参数中指定的某个时间)。它仅在javascript有一些空闲时间之后执行(在执行main代码之后)。那么javascript是如何实现这种行为的呢?可能有一个优先级堆栈(优先级在setTimout
的第二个参数上),它将在setTimout
中必须调用的函数保存在内存中。一旦javascript有空闲时间,他就推断出在调用函数之前等待的时间,并在时间过去后调用它们
我只做了一些假设。所以我想知道javascript是如何工作的,以及setTimout/setInterval
在幕后是如何工作的
另一个问题是:是否所有异步函数都是基于setTimout
实现的,以创建异步行为?也就是说,代码是以“某种”并行方式执行的(javascript一有时间就执行代码)。例如如何fs.readFile('/etc/passwd',utf8',callback)代码>有效吗
var fs = require('fs');
fs.readFile('/etc/passwd', 'utf8', function(){
console.log("ICI")
});
var i = 0;
while(true)
{
++i;
if(i == 2000000000) break;
}
console.log("LA");
在该示例中,我们看到所有while循环都被执行,然后打印“LA”,然后打印“ICI”。因此,异步调用是在javascript与前面的案例没有任何关系时执行的,setTimout
可能重复的