javascript如何实现setTimout / setInterval和异步函数

时间:2016-02-28 01:20:57

标签: javascript settimeout setinterval

我对setTimout有疑问。

为了理解我的观点,我们举一个例子:

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");

所以我们在这里,(即使代码在函数callback中具有f的异步样式),f中的while循环首先被执行,&# 34; CALLBACK"打印,然后"第一个在这里"打印,然后是" SECOND HERE"。即使乍一看我们认为由于callback中传递的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内。这里一切都在变化setTimout没有等待时间的第二个论点。所以通常现在应该执行代码(尽快)。但是这里" FIRST HERE"和#34;第二次在这里"首先打印,然后仅打印(在f中执行while循环之后),执行setTimout内的代码,然后执行" CALLBACK"打印出来。所以我们可以观察到,即使f中的代码现在应该被执行,它也只是在执行#34; main "执行块(在setTimout内)的代码。

所以这是我的问题。 javascript如何处理setTimeoutsetInterval?在该示例中,我们观察到代码不会立即执行(或在第二个参数中指定的特定时间)。它仅在javascript有空闲时间后执行(执行代码后)。那么javascript如何实现这种行为呢?可能有一个优先级堆栈(setTimout的第二个参数的优先级),它在内存中保存了必须在setTimout中调用的函数。一旦javascript有空闲时间,他就会在调用函数之前推断出等待的时间,并在时间结束后调用它们。

我只做了一些假设。所以我想确切地知道javascript是如何工作的以及setTimout/setInterval如何在幕后工作。

另一个问题是:是否所有异步函数都是基于setTimout实现的,以创建异步行为?即事实上,代码是在"类型的"中执行的。 parallel(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"印刷后和#34; ICI"打印出来。因此,当javascript与setTimout之前的案例无关时,执行异步调用。

0 个答案:

没有答案