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))......”呢?
答案 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后缀明确指出在函数名称'。