node.js - promise - 捕获内投

标签 node.js promise

我有以下代码,以及一些链式 promise 。我试图在内部 then 中抛出一个错误,我预计该错误会被外部 catch 捕获,但这不是当前的行为:

User.getById(userId).then((user: any) => {
    if (user.email != email) {
        User.getByEmail(email).then((user: any) => {
                throw new OperationError("exists"));
        }).catch(StorageError, (err: any) => {
            user.email = email;
            return user.save();
        });
    } else {
        return user.save();
    }
}).then((user: any) => {
    return {
        ok: true,
        user: user
    };
}).catch(OperationError, (error: any) => {
    return {
        ok: false,
        message: error.message
    };
}).asCallback(reply);

如何使外部 catch 成为 throw 语句的目标?

编辑 按照 Vohuman 的建议更新了代码。

User.getById(userId).then((user: any) => {
    finalUser = user;

    if (user.email != email) {
        return User.getByEmail(email);
    }
    else {
    //I would like for this response [1] to be used in [2]
        return Promise.resolve(user);
    }
}).then((user: any) => {
    throw new OperationError("Email already exists");
}).catch(StorageError, (error: any) => {

    finalUser.email = email;
    return finalUser.save();
}).then((user: any) => {
    //[2] here is where I would like the else statement to come 

    sendEmail(user.email, subject, content);
    return { ok: true, user: user };
}).catch(OperationError, (error: any) => {

    return { ok: false, message: error.message };
}).asCallback(reply);

现在我怎样才能在第一个 else 语句中解析用户而不让其被下面的 then 捕获?

这个想法是,如果数据库中不存在该电子邮件或者该电子邮件与请求帐户相同(重新发送电子邮件确认),则发送电子邮件确认。如果电子邮件已经存在,我想中止执行。

最佳答案

你的方法完全没问题,你只是忘记了一点return。没有它,内部 promise 将不会被等待,拒绝也不会触发外部catch

User.getById(userId).then((user: any) => {
    if (user.email != email) {
        return User.getByEmail(email).then((user: any) => {
//      ^^^^^^
            throw new OperationError("exists"));
        }).catch(StorageError, (err: any) => {
            user.email = email;
            return user.save();
        });
    } else {
        return user.save();
    }
}).then((user: any) => {
    return {
        ok: true,
        user: user
    };
}).catch(OperationError, (error: any) => {
    return {
        ok: false,
        message: error.message
    };
}).asCallback(reply);

关于node.js - promise - 捕获内投,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210513/

相关文章:

linux - 如何在centos 7上安装bower

JavaScript promise : Chaining promise confusion

javascript - 按照 promise 将 .map 函数中的扩展对象从服务返回到 Controller

javascript - 如何使用 Promise 以特定顺序操作 DOM 对象?

javascript - mongoose.save 的问题永远不会在 promise 内返回

javascript - 如何在写入时拆分 WriteStream?

javascript - 如何通过回调测量调用的持续时间并将其导出为 nodejs 模块?

javascript - 我如何解决 AngularJS 单元测试中的 promise

javascript - 如何获取[[PromiseValue] ]'s content if .then() doesn' t计算?

node.js - Nodejs Mongodb 对第一个 sort() 结果进行第二个 sort()