【问题标题】:Catch->Then->Catch example with BluebirdCatch->Then->Catch 与 Bluebird 的示例
【发布时间】:2016-08-29 13:18:25
【问题描述】:

我正在尝试使用 Promise 设置我的代码流,但我无法掌握哪些可以做,哪些不能做。

假设我有一个注册函数,我想要:

a) 注册用户 b) 记录注册过程 c) 发送激活邮件 d) 返回回调的答案

我首先查看用户是否已经存在,如果不存在,则抛出 StorageError,并在下一个 catch 块中捕获。

let basicRegister = function (request: any, reply: any) {
    let seneca = this;
    let act = Promise.promisify(seneca.act, { context: seneca });

    User.getByEmail(email).then(function (user: any) {
        throw new OperationError("Email already exists");
    }).catch(StorageError, function (err: any) {    
        return User.create().catch(function (err: any) {
            throw new OperationError(err.message);
        });
    }).then((user: any) => {    
        return UserActivity.create().catch(function (err: any) {
            throw new OperationError(err.message);
        });
    }).then(function (confirmationMessage: any) {

        //how can I obtain the user object here?

        return { ok: true, user: user };
    }).catch(OperationError, (error: any) => {
        console.log(error);
        return { ok: false, message: error.message };
    }).asCallback(reply);
}

根据上面的代码,我有以下几个问题:

1 - 像本例那样先捕获然后交错是否正常?如果不是,正确的做法是什么?

2 - 是否可以从最终的then 中的前一个then 获取user 对象?

如果您需要更多信息,请告诉我

【问题讨论】:

  • 不确定 1),但至于 2),您可以在 User.getByEmail 之前的行中声明 var finalUser;(或任何听起来合乎逻辑的内容),然后在第二个 .then() 中声明 finalUser = user块,因此 finalUser 变量在您的最终 then() 块中可用
  • 您的建议很有效,谢谢!

标签: node.js typescript bluebird


【解决方案1】:

为了访问用户对象,你可以在用户对象存在的范围内继续。关于你的错误处理:你只需要在最后捕获错误。无论如何,它们都会通过承诺链。

let basicRegister = function(request: any, reply: any) {
    let seneca = this;
    let act = Promise.promisify(seneca.act, {
        context: seneca
    });

    User.getByEmail(email).then(function(user: any) {
        throw new OperationError("Email already exists");
    }).catch(StorageError, function(err: any) {
        return User.create();
    }).then((user) => {
        return UserActivity.create()
            .then((confirmationMessage) => {
                return {
                    ok: true,
                    user: user
                };
            });
    }).catch(OperationError, (error: any) => {
        console.log(error);
        return {
            ok: false,
            message: error.message
        };
    }).asCallback(reply);
}

【讨论】:

  • 我试图避免“承诺地狱”,因此 Fissio 的评论可能会更好。关于您的回答,您的意思是我可以将第一个 catch 语句移到链的末尾吗?我还能将结果“转发”到then 语句吗?
  • @ManuelReis 不,当您将其转换为非抛出例如无错误块时,您需要第一个捕获。但你可以摆脱所有其他捕获。
  • 是的,你是对的,在这个特定的示例中,我可以删除 catch 语句,但我实际上是使用这些捕获来自定义错误消息。所以,为了清楚起见,交错使用 catch -> then -> catch 语句是否正确?
  • 是的,你可以这样做。
猜你喜欢
  • 2019-11-15
  • 2015-09-30
  • 1970-01-01
  • 2019-04-06
  • 2021-10-17
  • 2016-10-18
  • 2020-06-19
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多