是否适合在节点中使用'return {value}'?

时间:2015-03-13 22:02:02

标签: javascript node.js asynchronous

我在Node中编写了几个快速应用程序,而且我的知识存在可耻的差距。请放轻松我。

将这种传统格式用于Node.js中的函数是否合适?

function isGreaterThanZero ( val ){
    return val > 0; 
}

还是应该总是使用回调?

function isGreaterThanZero (val, cb){
    if (val > 0) {cb(true);}
    else {cb(false);}
}

Node.js的异步性质让我的大脑从内到外,我对所有事情都提出质疑。

1 个答案:

答案 0 :(得分:4)

当然是合适的

这适用于同步代码

function isGreaterThanZero(val){
    return val > 0; 
}

在非专业术语中,当没有什么可以等待时,您将使用同步功能。您将在下面提到的例外情况之外使用同步功能

对于内存中的操作,例如基本计算,字符串操作,数组追加等,您可以使用同步函数。

但是,某些同步函数确实使用了回调,但它们更多地用于映射或过滤目的。在评论中,我看到你问过arr.filter。其他功能(如arr.forEacharr.maparr.reduce会采用回调,但它们会隐式异步。在这种情况下,回调函数仅用于增强被调用函数的行为。


这适用于异步代码

function isGreaterThanZeroAsync(val, cb){
  // some long process...
  cb(val > 0);
}

当您需要等待时,您将使用异步功能。通常是网络,文件系统或数据库访问。异步功能允许您立即返回(退出)功能(如同步功能那样),但回叫将在它准备好后立即获取值。

这是一个小异步演示

function demoAsync(cb) {
  console.log("demo start");
  setTimeout(function() {
    cb("hello world");
  }, 1000);
}

console.log("init");
demoAsync(function(val) {
  console.log(val);
  console.log("demo done");
});
console.log("init done");

<强>输出

init
demo start
init done
// 1000 ms later...
hello world
demo done

为什么这很重要?

您获得"init""demo start&#34;和"init done&#34;立即。这表明您的程序可以继续,同时我们正在等待演示完成。

1000 ms之后,我们会看到"hello world""demo done"

万岁!一切都按顺序发生。