1
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 比较陌生,所以如果这听起来微不足道,请原谅我。假设 test(y) 为真。我可以确定console.log会在document.write之后执行吗?即使 test(y) 需要很长时间才能运行?

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

4

3 回答 3

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) {
        // ...
    }
});
于 2012-06-29T11:42:14.970 回答
0

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

于 2012-06-29T11:45:16.307 回答
0

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

于 2012-06-30T08:18:00.363 回答