使用 Bluebird 的 Catch->Then->Catch 示例

Catch->Then->Catch example with Bluebird

我正在尝试使用 promises 设置我的代码流,但我没能掌握什么是可以做的,什么不是。

假设我有一个注册函数,我想在其中:

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

我首先查看用户是否已经存在,如果不存在,则抛出 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 对象?

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

为了访问用户对象,您可以在用户对象所在的范围内继续 exists.Regarding 您的错误处理:您只需要在最后捕获错误。他们无论如何都会通过承诺链。

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);
}