Javascript 是";if(somefunction())";在node.js中阻塞?

Javascript 是";if(somefunction())";在node.js中阻塞?,javascript,node.js,Javascript,Node.js,目的是检查用户过去是否执行了某些操作。这些只是模拟代码,并不能真正反映我实际上在做什么 问题: 我对node.js比较陌生,所以如果这听起来很琐碎,请原谅我。假设测试(y)为真。我能否确保在document.write之后执行console.log?即使测试(y)需要很长时间才能运行 换句话说,我需要“if(test(y))…”被阻塞。我理解将函数作为参数传递,例如setInterval(test(y),100);可以是异步和非阻塞的。但是“if(test(y))…”呢?NodeJS同时具有同步

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

问题:

我对node.js比较陌生,所以如果这听起来很琐碎,请原谅我。假设测试(y)为真。我能否确保在document.write之后执行console.log?即使测试(y)需要很长时间才能运行


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

NodeJS同时具有同步(阻塞)和异步(非阻塞)功能。(更准确地说:函数本身总是“阻塞”的,但一整类函数都会启动一些稍后会完成的东西,然后立即返回,而不是等待事情完成。这就是我所说的“非阻塞”。)

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

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

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

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


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

console.log("Checked!");
如果它调用一个异步函数,那么它是异步的,因此它不能通过返回值返回结果,该返回值可以由
If
测试:

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")) {
    // ...
}
相反,您必须提供回调:

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

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

    return retVal;
}

NodeJS同时具有同步(阻塞)和异步(非阻塞)功能。(更准确地说:函数本身总是“阻塞”的,但一整类函数都会启动一些稍后会完成的东西,然后立即返回,而不是等待事情完成。这就是我所说的“非阻塞”。)

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

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

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

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


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

console.log("Checked!");
如果它调用一个异步函数,那么它是异步的,因此它不能通过返回值返回结果,该返回值可以由
If
测试:

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")) {
    // ...
}
相反,您必须提供回调:

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

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

    return retVal;
}

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

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

阻塞/非阻塞术语在这里有点混乱,我要说,'Node.JS中的所有函数都是阻塞的,而Node标准库中的所有IO都是非阻塞的,除了在函数名中用Sync后缀明确表示外。

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

取决于测试(y)在内部执行的操作。取决于测试(y)在内部执行的操作。感谢您的详细解释^__^谢谢你冗长的解释^__^谢谢是,每次都将执行console.log。对不起,我忘了提那件事。谢谢!是,每次都将执行console.log。对不起,我忘了提这个。setInterval(function(),5000)不是非阻塞的吗?即使“function()”不是IO并且需要很长时间才能完成?(新手问题)从这个意义上讲,计时器是IO(由相同的系统调用和底层描述符处理)。setInterval阻塞的含义是,在setInterval完成之前,您可以确保不会执行任何其他代码,唯一的副作用是创建了计时器引用函数()。函数()本身稍后会从事件循环调用(同样是以阻塞方式调用)。setInterval(函数(),5000)不是非阻塞的吗?即使“function()”不是IO并且需要很长时间才能完成?(新手问题)从这个意义上讲,计时器是IO(由相同的系统调用和底层描述符处理)。setInterval阻塞的含义是,在setInterval完成之前,您可以确保不会执行任何其他代码,唯一的副作用是创建了计时器引用函数()。函数()本身稍后从事件循环调用(同样是以阻塞方式)。