节点js中的回调函数vs返回函数

时间:2014-12-28 18:13:45

标签: javascript node.js function callback

我是节点js的新手。似乎回调函数是在节点中编写函数的规范。这是真的?写回调函数与函数相比返回结果有什么好处?我应该何时编写回调函数,何时应该在节点js中使用常规返回函数?

2 个答案:

答案 0 :(得分:0)

Node服务器是单线程的(用于应用程序代码),你在Node中进行回调的原因是允许线程在等待输入/输出时释放进行其他处理。通常这意味着您只需使用所有调用的异步版本(例如fs.readFile)而不是同步调用(例如fs.readFileSync)。

如果要创建模块并在模块内执行异步调用,则会编写类似的异步调用。然后你的呼叫者需要为你提供一个回调,你可以调用它来返回结果。

您也可以使用像promise这样的库来代替返回承诺。

答案 1 :(得分:-1)

回调是低级别的界面,不适合人类。你应该使用generator,promises,async或其他任何东西来包装回调。

这样做的最终好处是可以轻松地同时执行任务。

例如,这种语法:

var arr = [];
for (var i = 0; i < 10; ++i) {
    arr.push(readSomeFile());
}

一直意味着一次读取1个文件,任何编译器或转换器都无法知道所有文件读取都可以同时完成。因此,如果读取1个文件需要10毫秒,则此代码需要100毫秒才能运行,而它可能只需要10毫秒才能运行。

对于这两种不同的方法,你根本无法使用相同的语法。

然而,你可以非常接近:

var Promise = require("bluebird");
var fs = Promise.promisifyall(require("fs"));

Promise.coroutine(function* () {
    var arr = [];
    for (var i = 0; i < 10; ++i) {
        arr.push(fs.readFileAsync(...));
    }
    arr = yield Promise.all(arr);
})();

这也会读取10个文件,但它们会同时读取而不是顺序读取,这是同步语法无法做到的。