Node.js 捕获->;然后->;以蓝鸟为例

Node.js 捕获->;然后->;以蓝鸟为例,node.js,typescript,bluebird,Node.js,Typescript,Bluebird,我试图使用承诺来设置代码流,但我无法理解什么是可能的,什么是不可能的 假设我有一个寄存器函数,我想: a) 注册用户 b) 记录注册过程 c) 发送激活电子邮件 d) 将答案返回回调函数 我首先查看用户是否已经存在,如果不存在,则抛出StorageError,并在下一个catch块中捕获 let basicRegister = function (request: any, reply: any) { let seneca = this; let act = Promise.pr

我试图使用承诺来设置代码流,但我无法理解什么是可能的,什么是不可能的

假设我有一个寄存器函数,我想:

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
对象


如果您需要访问userobject的更多信息,请告诉我,您可以在user object存在的范围内继续。关于错误处理:您只需要在最后捕获错误。无论如何,他们都会通过承诺链

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

不确定1),但对于2),您可以声明
var finalUserUser.getByEmail
之前的行中使用code>(或任何听起来合乎逻辑的内容),然后在第二个
中使用
finalUser=User
。然后()
块,因此在最后一个
then()
块中可以使用
finalUser
变量您的建议很好,谢谢!我试图避免“承诺地狱”,因此也许菲西奥的评论会更有效。关于你的回答,你的意思是我可以把第一个catch语句移到链的末尾吗?我是否仍然能够将结果“转发”到
then
语句?@ManuelReis no您需要第一个捕获,因为您需要将其转换为非抛出的例如无错误块。但是你可以删除所有其他捕获。是的,你是对的,在这个特定的示例中,我可以删除
catch
语句,但实际上我使用这些捕获来定制错误消息。那么,需要澄清的是,将
catch
->
语句交织在一起是否正确?是的,您可以这样做。