在 Node.js 的回调周围放置返回值

2024-03-02

一点背景知识;我使用node.js,发现通过返回可以避免许多错误all异步代码中的回调。例如:

function useMyAsyncFunc(stuff, c, callback)
    myAsyncFunc(stuff.a, stuff.b, c, function (error, data) {
        if (error) {
            return callback(error);
        }

        // Long body of code in here.

        return callback(null, data);
    });
}

我的问题是,考虑到回调链可能非常大,执行上述操作会更好吗?

function useMyAsyncFunc(stuff, c, callback)
    myAsyncFunc(stuff.a, stuff.b, c, function (error, data) {
        if (error) {
           callback(error);
           return;
        }

        // Long body of code in here.

        callback(null, data);
        return;
    });
}

更有效率吗?

更明确地说,节点是否从后者中受益,即被告知忽略回调函数的返回值?


我同样同意,一般来说,与“callback(); return;”相比,“return callback()”不会造成任何损害,也不会显着影响性能。我决定在测试“process.nextTick(... cb ...); return;”的同时对其进行测试。

尝试以下代码:

'use strict';

var showComments = 0;
var counter = 10000;
var ab = process.argv[2];

function a(x, cb) {
    var myCB = function (err, result) { x = result; }

    x *= 1.01;
    if (showComments) console.log('start counter =', counter, ', x = ', x);

    if (--counter > 0) a(x, myCB);

    if (showComments) console.log("cb'ing");

    switch (ab) {
        case 'a':
            return cb(undefined, x);

        case 'b':
            cb(undefined, x);
            return;

        case 'c':
            process.nextTick(function () { cb(undefined, x); });
            return;

        default:
            console.log('Oops!  Try typing "node testReturnCallBack.js [a|b|c]"');
            process.exit(1);
    }
}

var start = (new Date()).getTime();

a(1, function (err, result) {
    console.log('final result = ', result);

    var finish = (new Date()).getTime();
    var diff = finish - start;
    console.log('run took %d milliseconds', diff);
});

您应该看到,多次运行的情况“a”和“b”返回的时间基本相同(以毫秒为单位),而计算值保持不变。同时,情况“c”花费的时间大约长 50%。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Node.js 的回调周围放置返回值 的相关文章

随机推荐

  • 我的 RestController 没有触发 @ControllerAdvice 和 @ExceptionHandler

    为了在整个应用程序中进行统一的异常处理 我正在使用使用 Spring 进行 REST 的错误处理 https www baeldung com exception handling for rest with spring解决方案 3 使用
  • MVC3 中的 POCO 类和 ViewModel

    我不是一名经验丰富的 MVC3 开发人员 但我正在努力成为一名经验丰富的 MVC3 开发人员 我熟悉 POCO 类和 ViewModel 因为前者描述了数据库的每个类 后者用于 mvc3 中的强类型视图 对于经验丰富的开发人员来说 我的问题
  • 用于插入、更新、删除后将数据按顺序输入日志表的 PL/SQL 触发器

    我正在解决家庭作业问题 我的触发器遇到了编译问题 并且无法理解如何创建引用序列和另一个表的触发器 并将这些值插入到我创建的日志表中 我读过 在表列条目上使用 SERIAL not null 可能会消除对序列和引用表的需要 http www
  • django:datediff sql 查询?

    我正在尝试在 Django 中执行与以下 SQL 等效的操作 SELECT FROM applicant WHERE date out date in gt 1 AND date out date in lt 6 我可以将其作为 RAW s
  • 将 div 扩展到滚动高度

    我需要扩展一个通过 css 将溢出设置为隐藏的 div 单击 展开 时 div 的高度将扩展到显示整个文本所需的高度 为了实现这一目标 我使用以下代码 expand click function mainDiv animate height
  • Safari/Chrome (Webkit) - 无法隐藏 iframe 垂直滚动条

    我有一个iframe在 www example com 上 指向 support example com 这是外部域的 CNAME 我自动调整 iframe 的高度 以便框架不需要任何滚动条来显示所包含的网页 在 Firefox 和 IE
  • 使用 stdin stdout 和 stderr 启动 exe/进程?

    使用 C 我如何使用 stdin stdout 和 stderr 启动 exe 进程 我知道如何在 NET 中执行此操作 我记得过去使用过 popen 但 popen 似乎允许 stdin 或 stdout 但不能同时使用 也不能全部使用
  • 如何在不使用 Amplify 的情况下使用 Amazon Cognito

    我现在刚刚开始研究 Cognito AWS 的设置相当简单 直接 我们有各种应用程序 网络应用程序和服务 我们希望它们能够使用 Cognito 服务 我有使用 Auth0 进行类似设置的经验 但由于我们一直在利用许多 Amazon Web
  • 并行启动测试时 Django 的“override_settings”装饰器如何工作

    我正在检查 Django 的设置模块是如何构建的以及如何覆盖设置 https docs djangoproject com en 3 2 topics testing tools django test override settings装
  • 在控件上使用 DoubleBuffer 的优点和缺点

    默认情况下 Windows 控件没有 DoubleBuffer 当我使用它时 我可以减少闪烁 为什么它在 Windows 控件中默认不使用 任何人都可以说出在控件上使用 DoubleBuffer 时的优点和缺点 Thanks 当我们想要创建
  • Web api 身份验证和 MVC 4

    我有以下解决方案 Web API 项目 MVC 4 项目 我需要通过使用 JSON 请求发送凭据来对用户进行身份验证 https 是必须的 这是一个好方法吗 以及如何在 Web api 和 MVC 上对用户进行身份验证 这是一个好方法吗 是
  • 如何在 django 中使 @cached_property 无效

    我目前正在使用 cached property在模型类上 我想在保存时删除它 以便可以在下次调用时重新填充它 我该怎么做呢 例子 class Amodel model fields cached property def db connec
  • Linux调度程序需要上下文切换吗?

    我有一个关于 linux 调度程序和其他一些类似的内核系统调用的一般问题 Linux调度程序是否被视为一个 进程 并且对调度程序的每次调用都需要像另一个进程一样进行上下文切换 假设我们有一个时钟滴答声 它会中断当前正在运行的用户模式进程 现
  • Excel 检测并跟踪任何工作表中的(值)变化

    我已经设法编写了一个代码来检测任何工作表中特定单元格的值变化 但我一直在努力构建一些检测和跟踪范围 值 变化的代码 例如 如果用户决定复制并粘贴某些范围的数据 假设超过 1 个单元格 宏将不会捕获它 用户选择一个范围 然后在仍选择范围的情况
  • 反转动画

    我有一个 ImageView 当它添加到布局中时它会变得动画 当它被删除时 我想反转相同的动画 有没有办法在android中反转动画而不需要重新编码和反转参数 不 遗憾的是你不能用动画对象来做到这一点 但您可以使用插值器来模拟它 该插值器将
  • IPython Notebook - 在 Javascript 中检测内核是否繁忙/空闲

    我目前正在尝试使用 IPython 笔记本获得交互式绘图 我遇到的问题之一是 当通过 javascript 中的 IPython notebook kernel execute 方法执行 Python 代码时 我无法知道该代码何时完成执行
  • Jenkins - 同时运行单个构建的实例

    我希望能够同时运行同一个 Jenkins 作业的多个构建 Example 构建 jenkins job 1 使用参数 A 调用 ant 脚本 构建 jenkins job 1 使用参数 B 调用 ant 脚本 根据需要重复 作业的每个实例同
  • 是否可以将 Series 附加到 DataFrame 的行而不先创建列表?

    我有一些数据正在尝试组织成DataFrame in Pandas 我试图让每一行Series并将其附加到DataFrame 我找到了一种方法 通过附加Series到一个空的list然后转换list of Series to a DataFr
  • 如何在 ggtern 中显示数据的真实值 (%)?

    我希望得到与下例所示大致相同的结果 我在这两个函数之间犹豫是否要得到这个结果 geom crosshair tern and scale X continuous 汉密尔顿 NE 和费里 M 2018 ggtern 使用 ggplot2 的
  • 在 Node.js 的回调周围放置返回值

    一点背景知识 我使用node js 发现通过返回可以避免许多错误all异步代码中的回调 例如 function useMyAsyncFunc stuff c callback myAsyncFunc stuff a stuff b c fu