我是第一次接触node js。回调函数似乎是在节点中编写函数的规范。这是真的吗?与函数返回结果相比,编写回调函数的优点是什么?什么时候我应该写回调函数,什么时候我应该只使用节点js中的常规返回函数?
发布于 2014-12-29 02:36:15
Node服务器是单线程的(对于应用程序代码),您在Node中进行回调的原因是允许线程在等待输入/输出时进行其他处理。通常,这意味着您只需使用所有调用的异步版本(例如fs.readFile),而不使用同步版本(例如fs.readFileSync)。
如果您正在创建一个模块,并且在模块内部进行异步调用,那么您将编写类似的异步调用。然后,您的调用者需要为您提供一个回调,您可以调用它来返回结果。
您也可以使用promise这样的库来返回promise。
发布于 2014-12-29 02:56:23
回调是不适合人类使用的低级接口。你应该用生成器,promises,async或者其他的东西来包装回调。
这样做的最终好处是很容易并发执行任务。
例如,此语法:
var arr = [];
for (var i = 0; i < 10; ++i) {
arr.push(readSomeFile());
}将始终意味着一次读取一个文件,任何编译器或转译器都不可能知道所有的文件读取可以同时完成。因此,如果读取一个文件需要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个文件,但它们将是并发读取的,而不是顺序读取的,这是使用同步语法所不能做到的。
https://stackoverflow.com/questions/27679202
复制相似问题