首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >回调函数与节点js中的返回函数

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

Stack Overflow用户
提问于 2014-12-29 02:13:45
回答 2查看 941关注 0票数 0

我是第一次接触node js。回调函数似乎是在节点中编写函数的规范。这是真的吗?与函数返回结果相比,编写回调函数的优点是什么?什么时候我应该写回调函数,什么时候我应该只使用节点js中的常规返回函数?

EN

回答 2

Stack Overflow用户

发布于 2014-12-29 02:36:15

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

如果您正在创建一个模块,并且在模块内部进行异步调用,那么您将编写类似的异步调用。然后,您的调用者需要为您提供一个回调,您可以调用它来返回结果。

您也可以使用promise这样的库来返回promise。

票数 0
EN

Stack Overflow用户

发布于 2014-12-29 02:56:23

回调是不适合人类使用的低级接口。你应该用生成器,promises,async或者其他的东西来包装回调。

这样做的最终好处是很容易并发执行任务。

例如,此语法:

代码语言:javascript
复制
var arr = [];
for (var i = 0; i < 10; ++i) {
    arr.push(readSomeFile());
}

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

对于这两种不同的实现方式,您不能使用相同的语法。

但是,您可以非常接近:

代码语言:javascript
复制
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个文件,但它们将是并发读取的,而不是顺序读取的,这是使用同步语法所不能做到的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27679202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档