我有以下代码,以及一些链式 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/