在node.js中“if(somefunction())”阻塞了吗?

时间:2012-06-29 11:39:34

标签: javascript node.js

test = function(x){   
    if ( some conditions ) { return true; }
    else { return false; }
}


if (test(y)) {document.write("You have done this before!")​}​;​

console.log("Checked!");

目的是检查用户过去是否执行了某些操作。这些只是模拟代码,但并没有真正反映我实际在做什么。

问题:

我对node.js比较新,所以如果这听起来微不足道,请原谅我。假设测试(y)为真。我能确定在document.write之后执行console.log吗?即使测试(y)需要很长时间才能运行?

换句话说,我需要“if(test(y))......”才能阻止。我理解将函数作为参数传递,例如的setInterval(测试(Y),100);可以是异步和非阻塞。但是“如果(测试(y))......”呢?

3 个答案:

答案 0 :(得分:8)

NodeJS具有同步(阻塞)和异步(非阻塞)功能。 (更准确地说:函数本身总是“阻塞”但是它们的整个类开始会在稍后完成,然后立即返回,而不是等待事情完成。这些是什么我的意思是“非阻塞。”)

在大多数情况下,默认是异步的(并且当他们启动的东西完成时,他们接受他们调用的回调);同步的名称往往以Sync结尾。

因此,例如,exists是异步的(非阻塞),它没有返回值,而是在完成后调用回调。 existsSync是同步的(阻塞);它返回其结果而不是回调。

如果test是你自己的函数,并且它只调用同步函数,那么它是同步的:

function test(x) { // Obviously a nonsense example, as it just replicates `existsSync`
    if (existsSync(x)) {
        // The file exists
        return true;
    }
    return false;
}

// This works
if (test("foo.txt")) {
    // ...
}

如果它调用异步函数,则它是异步的,因此它不能通过if可以测试的返回值返回结果:

// WRONG, always returns `undefined`
function test(x) {
    var retVal;

    exists(x, function(flag) {
        retVal = flag;
    });

    return retVal;
}

相反,您必须提供回调:

function test(x, callback) {

    exists(x, function(flag) {
        callback(flag);
    });
}

// This works
test("foo.txt", function(flag) {
    if (flag) {
        // ...
    }
});

答案 1 :(得分:0)

是的,此代码是同步执行和“阻止”。但是每次运行脚本时都会执行console.log,因为你只省略了if语句中的document.write。

答案 2 :(得分:0)

阻塞/非阻塞术语在这里有点令人困惑,我会说'Node.JS中的所有函数都是阻塞的,节点标准库中的所有IO都是非阻塞的,除非由Sync后缀明确指出在函数名称'。