Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript如何实现setTimout/setInterval和异步函数_Javascript_Settimeout_Setinterval - Fatal编程技术网

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

可能重复的