jquery - 将内部失败/拒绝传递给 jquery 中的外部 promise 以避免代码重复

标签 jquery node.js typescript deferred

我是这个延迟的新手,但发现了一个低点。我仍在寻找一种方法来“保存”以下代码中的冗余 fail -> login:

$.when(loginHandler.findLegacyUser(username, password))
    .done((doc:imports.ILegacyUser) => {
        $.when(loginHandler.migrateUser(doc, password))
            .done((doc:model.IUser) => {
                req.feedback.add("Your existing account was migrated successfully");
                req.session.username = doc.username;
                res.redirect('/members/');
            }).fail((err) => {
                login(req, res);
            });
    }).fail((err) => {
        login(req, res);
    });

我希望从命名中可以清楚地看出它的作用。因此,无论何时迁移失败,我们都希望执行正常的 login。要迁移,我们首先必须查找 LegacyUser,如果它是 null,则 migrateUser(doc, password) 将会失败。

我喜欢做的是以某种方式将内在的拒绝传递给外在的 promise 。

最佳答案

我不完全确定我理解你的意思,但我猜你只需要一个失败处理程序,并且代码应该执行它,而不管被拒绝的是外部 promise 还是内部 promise 。

在这种情况下,您应该提供自己的 promise 并将这两个调用包装在一个将返回此 promise 的方法中。然后您可以将已解决和已拒绝的处理程序附加到此 promise 。

代码:

var migrateWhenLegacyUser = function(username, password){
    var deferred = $.Deferred();

     $.when(loginHandler.findLegacyUser(username, password))
         .done((doc:imports.ILegacyUser) => {
            $.when(loginHandler.migrateUser(doc, password))
                .done((doc:model.IUser) => {
                    deferred.resolve(doc);
                }).fail((err) => {
                    deferred.reject(req, err);
                }
            );
        }).fail((err) => {
            deferred.reject(req,err);
        }
    );   

    return deferred;
}

// usage example
migrateWhenLegacyUser("user","password").done((doc) => {
    req.feedback.add("Your existing account was migrated successfully");
    req.session.username = doc.username;
    res.redirect('/members/');
}).fail((req, err) => {
    login(req, res)
});

关于jquery - 将内部失败/拒绝传递给 jquery 中的外部 promise 以避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21246180/

相关文章:

javascript - 数据表,如果在选项内

Angular 2 - [(ngModel)] 在 [value] 更改后不更新

javascript - 无法在网页上显示和隐藏雷达层

javascript - 删除 ‌ 字符

Node.js:curl:(52)来自服务器的空回复,请求中的空格未编码

node.js - Express.js 中 "bodyParser.urlencoded({ extended: true }))"和 "bodyParser.json()"的含义是什么?

javascript - TypeScript 无法编译 - 发现错误附加的项目

angular - 从 6.1 更新后,@Input() 在 Angular 9 上具有空值

javascript - 从网站/浏览器拖放文件下载到本地文件系统

node.js - 如何在 Mongodb 上实现行级安全性 (RLS)