Node.js 和使用 Q 进行异步编程

2024-01-13

以下是正确的处理方式吗?这是一个注册控制器操作。我正在创建一个用户和一个组以将用户添加到其中。请注意,我有称为用户和组的方法级别变量。其余代码使用 Q 模块进行异步。

是否可以使用方法级别变量,或者它们会被同时注册的其他人覆盖吗?

exports.postSignUp = function(req, res, next) {

    var user,
        group;

    return Q.invoke(exports, 'parseUser', req, null)
        .then(function(u)
        {
            user = u;
            return Q.invoke(exports, 'postCreateUser', user).fail(function(err) { throw err; });
        })
        .then(function()
        {
            group = new Group();
            group.userIds = [user._id];
            return Q.invoke(exports, 'postCreateGroup', group).fail(function(err) { throw err; });
        })
        .then(function()
        {
            user.groupId = group._id;
            group.userIds = [ user._id ];
        })
        .then(function()
        {
            return Q.ninvoke(req, 'login', user).fail(function(err) { throw err; });
        })
        .then(function()
        {
            return res.redirect('/tour');
        })
        .fail(function (err)
        {
            console.log('u:' + user);
            console.log('g:' + group);
            return exports.createValidationError(error, req, res, user);
        });
};

是否可以使用方法级别变量,或者它们会被同时注册的其他人覆盖吗?

不,他们不会,因为它们的范围仅限于您的本地postSignUp功能。

然而它有点难看,在这里嵌套它们可能是更好的选择:

exports.postSignUp = function(req, res, next) {
    return Q.invoke(exports, 'parseUser', req, null).then(function(user) {
        return Q.invoke(exports, 'postCreateUser', user).then(function(createdUser) {
            var group = new Group();
            group.userIds = [user._id];
            return Q.invoke(exports, 'postCreateGroup', group).then(function(createdGroup) {
                user.groupId = group._id;
                group.userIds = [ user._id ]; // repeat this?

                return Q.ninvoke(req, 'login', user)
            }).then(function(loggedInuser) {
                return res.redirect('/tour');
            }).fail(function(err) {
               console.log('g:' + group);
               throw err;
            });
        }).fail(function(err) {
            console.log('u:' + user);
            return exports.createValidationError(error, req, res, user);
        });
    }) // .fail(function(err) {
       //     … // parseUser or createValidationError failed
       // });
};

我真的需要将所有不同的步骤分解为不同的函数吗?或者我可以只拥有 1 个异步函数吗?

您当前有一个异步函数,您可能希望将其分解为使用新组创建用户,然后将其登录并重定向到/tour.

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

Node.js 和使用 Q 进行异步编程 的相关文章

随机推荐

  • 跨不同域和不同应用程序共享 cookie(经典 ASP 和 ASP.NET)

    有没有办法跨不同域和不同应用程序 经典 ASP 和 ASP NET 共享 cookie 不 没有 问题是跨域问题 而不是 asp net classic asp 并且是安全原因 如果域是子域 您可以共享 cookie 前提是您使用双方都可以
  • VSCode 中 jupyter 笔记本中的交互式 python 3d 绘图

    When I use jupyter notebook in Chrome I had the opportunity to show interactive 3d plots like this 现在我想在 VSCode 中看到相同的结果
  • 如何使用 keycloak 和 spring 读取所有用户?

    我在用着keycloak 3 4 and spring boot开发一个网络应用程序 我使用 Active Directory 作为用户联合来检索所有用户信息 但要在我的网络应用程序中使用这些信息 我想我必须将它们保存在 local web
  • 多级页表——分层分页

    过去操作系统期末考试的示例问题 我如何计算此类问题 计算机有 64 位虚拟地址空间和 2048 字节页面 一个页表项占用 4 个字节 使用多级页表是因为每个表必须包含在一个页内 需要多少级 我该如何计算这个 由于页表必须适合一个页面 因此页
  • 更改分割线突出显示/调整线条大小

    我注意到 当我在 Visual Studio 中调整元素大小时 分割线会被涂成纯透明的黑色 如下所示 然而 在我自己的 Winforms 应用程序中 我得到了以下调整大小行 我想知道如何改变这条调整线的绘画 如果你看一下分离器源代码 htt
  • Firebase 身份验证 FirebaseNetworkException:发生网络错误(例如超时、连接中断或无法访问主机)

    我正在为我的 Android 应用程序创建身份验证工作流程 我允许用户使用用户名 密码和各种 OAuth 提供商登录 我正在验证电子邮件和密码 以便我知道传递给 Firebase 的信息是有效的 我在用着com google firebas
  • 获取 boto.cfg 中的 Python 凭据文件

    我是第一次使用 AWS 刚刚安装了 python 的 boto 我陷入了它建议的步骤 您可以将此文件放置在 etc boto cfg 中供系统范围使用 也可以放置在执行命令的用户的主目录中 boto 老实说 我不知道该怎么办 首先 我找不到
  • 使用 newID() 创建函数

    我不断收到此错误 有什么想法吗 在函数内的 newid 中无效使用副作用或时间相关运算符 我正在与MS SQL Server 2005 这里是T SQL陈述 Create Function dbo GetNewNumber RETURNS
  • 触发多事件

    我可以在trigger 中触发多个事件或在JQuery 中链接它们吗 例如 element trigger event1 event2 event3 or element trigger event1 trigger event2 or e
  • =~ 在 Perl 中做什么?

    我猜标签是一个变量 它正在检查9eaf 但这在 Perl 中存在吗 这里的 符号是做什么的 前后的 字符是什么9eaf doing if tag 9eaf Do something 是测试正则表达式匹配的运算符 表达方式 9eaf 是一个正
  • 什么都没有,WithEvents 字段和内存泄漏

    是否需要设置为Nothing 在 Dispose 中 所有WithEvents fields 显然Handles关键字将处理程序添加到此类字段 但不会将其删除 直到该字段不再存在为止 Nothing 这会产生内存泄漏 这对于像这样的情况应该
  • fork() 后处理子进程中 std::thread 终止的正确方法

    你想皱多少皱眉就皱多少 无论如何我都会这么做 我的问题是 在下面的代码中 处理终止的正确方法是什么std thread在生成的子进程中fork std thread detach or std thread join include
  • 如何在 Rails 1.2.3 中使复选框默认为“选中”?

    如何使复选框在最初显示时默认为 选中 我还没有找到一种 Rails 方法来做到这一点 有效 所以我用 JavaScript 做到了 Rails 有没有正确的方法来做到这一点 我正在使用 Rails 1 2 3 导轨 3 x form for
  • 在 Android 上刷新地图活动中的覆盖对象

    我必须构建一个地图活动 最重要的是 我需要显示一些位置点 这些位置是从另一个类的哈希表中检索的 该哈希表的内容始终会发生变化 因此 我希望看到地图活动上的这些位置点随着哈希表的修改而移动 代码如下所示 Override public voi
  • 动态数据表到实体*无需*提前进行硬编码...?

    问题 问 为什么不能 如何动态使用 DataTable 中的数据在使用反射 的函数中创建 LINQ EF 以根据可用内容创建实体实例 我看到了很多很多的问题和关于硬编码 但没有人这样做动态地 我正在寻找一种替代方法 不必为我的所有实体维护硬
  • Angular 2+:IE11 严格模式下不允许对属性进行多重定义

    我安装了 pollyfills 但在 main bundle js 中的 Internet Explorer 11 中收到此错误 它位于第 9692 行 但是查看编译后的代码 我无法理解它 这里是 styles nng select cus
  • 计算每个组的 data.table 窗口中的值数量

    我正在尝试添加新列data table 其中行中的值取决于行中值的相对关系 更准确地说 如果一行中有一个值 X 我想知道同一列 和组 中有多少个其他值在 X 30 范围内 也就是说 考虑到 DT lt data table X c 1 2
  • 在 PyQt 中播放声音文件

    我在 PyQt 中开发了一个播放声音的软件 我使用 Phonon Library 来播放声音 但它有一些滞后 那么如何在不使用 Phonon Library 的情况下在 PyQt 中播放声音文件 这就是我目前使用 Phonon 的方式 de
  • 尝试使用 Powershell 从 csv 导入信息,但不幸的是某些结果出现错误

    AuditSuccess Import Csv Path G LabLog csv Where Object Keywords like Audit Success Measure Object Select Object count Au
  • Node.js 和使用 Q 进行异步编程

    以下是正确的处理方式吗 这是一个注册控制器操作 我正在创建一个用户和一个组以将用户添加到其中 请注意 我有称为用户和组的方法级别变量 其余代码使用 Q 模块进行异步 是否可以使用方法级别变量 或者它们会被同时注册的其他人覆盖吗 export