Node.js 捕获->;然后->;以蓝鸟为例
我试图使用承诺来设置代码流,但我无法理解什么是可能的,什么是不可能的 假设我有一个寄存器函数,我想: a) 注册用户 b) 记录注册过程 c) 发送激活电子邮件 d) 将答案返回回调函数 我首先查看用户是否已经存在,如果不存在,则抛出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
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 finalUser在User.getByEmail
之前的行中使用code>(或任何听起来合乎逻辑的内容),然后在第二个中使用finalUser=User
。然后()
块,因此在最后一个then()
块中可以使用finalUser
变量您的建议很好,谢谢!我试图避免“承诺地狱”,因此也许菲西奥的评论会更有效。关于你的回答,你的意思是我可以把第一个catch语句移到链的末尾吗?我是否仍然能够将结果“转发”到then
语句?@ManuelReis no您需要第一个捕获,因为您需要将其转换为非抛出的例如无错误块。但是你可以删除所有其他捕获。是的,你是对的,在这个特定的示例中,我可以删除catch
语句,但实际上我使用这些捕获来定制错误消息。那么,需要澄清的是,将catch
->语句交织在一起是否正确?是的,您可以这样做。