繁体   English   中英

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

[英]Callback function vs return function in node js

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

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

如果要创建模块,并且在模块内部进行异步调用,则将编写类似的异步调用。 然后,您的呼叫者将需要为您提供回调,您可以调用该回调以返回结果。

您也可以使用诸如promise之类的库来代替promise。

回调是不适用于人类的低层接口。 您应该使用生成器,promise,异步或其他方式包装回调。

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

例如,以下语法:

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

将始终意味着一次读取一个文件,任何编译器或编译器都无法知道所有文件可以同时读取。 因此,如果读取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个文件,但是它们将同时读取而不是顺序读取,这是同步语法无法做到的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM