猫鼬静态方法返回一个蓝鸟承诺
Posted
技术标签:
【中文标题】猫鼬静态方法返回一个蓝鸟承诺【英文标题】:mongoose static method returns a bluebird promise 【发布时间】:2015-03-06 18:24:03 【问题描述】:我正在创建一个猫鼬静态方法“加载”,以便我的主控制器功能可以使用它(用于链接和错误处理)。
UserSchema.load('54ae92dd8b8eef540eb3a66d')
.then(....)
.catch(....);
问题是 id 有问题,所以我需要捕获这个错误。我认为最好在模型层中执行此操作。
当我执行以下操作时,控制器可以捕获此错误。
UserSchema.statics.load = function(id)
if (!mongoose.Types.ObjectId.isValid(id))
return Promise.resolve().then(function()
throw new Error('not a mongoose id');
); ------------( * )
return Promise.cast(this.findOne(
_id: id
).exec());
;
但如果我只执行以下操作,则错误不会成功抛出到控制器 .catch 函数中。
AchievementSchema.statics.load = function(id)
if (!mongoose.Types.ObjectId.isValid(id))
throw new Error('not a mongoose id');
return Promise.cast(this.findOne(
_id: id
).exec());
;
所以我的问题是我这样做是否正确?如果是这样,是否有更简单的方法来编写 (*) 语句?我在做什么看起来很丑……谢谢。
【问题讨论】:
【参考方案1】:是的,有一个叫Promise.reject
的简写。
您的代码在:
if (!mongoose.Types.ObjectId.isValid(id))
return Promise.resolve().then(function()
throw new Error('not a mongoose id');
); ------------( * )
可以写成:
return Promise.reject(new Error("Not a mongoose id");
你可以做得更好,Promise.method
的存在是为了确保任何可能返回承诺将返回承诺:
UserSchema.statics.load = Promise.method(function(id)
if (!mongoose.Types.ObjectId.isValid(id))
throw new Error('not a mongoose id: ' + id);
return this.findOne( _id: id ).exec());
);
这会将 findOne
结果转换为 Bluebird 信任的 Promise 并将 throw
转换为您的拒绝。不过,您可能需要考虑抛出 Promise.OperationalError
的子类而不是 Error
。
作为一个不相关的提示,Promise.cast
在一年前已被弃用,取而代之的是 Promise.resolve
。
【讨论】:
如果我不将所有的承诺都投给 bluebird 承诺,Promise.method
中的承诺是否会有竞争条件?以上是关于猫鼬静态方法返回一个蓝鸟承诺的主要内容,如果未能解决你的问题,请参考以下文章