我是节点js的新手。似乎回调函数是在节点中编写函数的规范。这是真的?写回调函数与函数相比返回结果有什么好处?我应该何时编写回调函数,何时应该在节点js中使用常规返回函数?
答案 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个文件,但它们会同时读取而不是顺序读取,这是同步语法无法做到的。