承诺问题:使用 Q.nfcall() 调用 mongoose.findOne()
Posted
技术标签:
【中文标题】承诺问题:使用 Q.nfcall() 调用 mongoose.findOne()【英文标题】:Promise issue: using Q.nfcall() to call mongoose.findOne() 【发布时间】:2016-04-14 23:56:31 【问题描述】:我有以下代码,其中mongoose
的findOne
方法使用Q.promise
包装:
// _getById should be returning a Promise
var _getById = function(id)
return Q.Promise(function(resolve, reject)
ApplicationModel.findOne(
_id: id,
'metadata.isDisabled': false
,
'-metadata',
function(err, application)
if (err)
return reject(err);
if (!application)
return reject(new CustomError('Not found', 404));
resolve(application);
);
);
我正在尝试使用Q.nfcall
方法重构该代码,这就是我目前所拥有的:
var _getById = function(id)
var searchOptions =
_id: id,
'metadata.isDisabled': false
;
return Q.nfcall(ApplicationModel.findOne, searchOptions, '-metadata')
.then(function(application)
if (!application)
throw new CustomError('Not found', 404);
return application;
);
但它不起作用,我在屏幕上收到以下错误:
信息:TypeError:无法读取属性“discriminatorMapping”的 不明确的 在 findOne [...]
似乎没有使用Q.nfcall
正确调用findOne
方法,我正在关注Q's API Reference for nfcall function,但我不明白为什么。
【问题讨论】:
你知道mongoose
已经被承诺了吗? return ApplicationModel.findOne(ApplicationModel.findOne, searchOptions, '-metadata').then( ... );
@ShanShan 是吗?我有第一个通知! (如果我这样做了,我就不会承诺了^^)
是的,试试我写的代码,应该可以的。不过你有一个借口,猫鼬文档不是最容易阅读的:p
@ShanShan hahaha 我同意,它们不是最简单的!谢谢!! :-) 我现在要试试。您可以将其发布为答案,我会将其标记为正确。
@ShanShan 完美运行!继续,回答问题! :-)
【参考方案1】:
猫鼬已经被承诺了。因此,您的代码可以是:
var _getById = function(id)
var searchOptions =
_id: id,
'metadata.isDisabled': false
;
return ApplicationModel.findOne(searchOptions, '-metadata')
.then(function(application)
if (!application)
throw new CustomError('Not found', 404);
return application;
);
【讨论】:
这非常有用!!以上是关于承诺问题:使用 Q.nfcall() 调用 mongoose.findOne()的主要内容,如果未能解决你的问题,请参考以下文章
通过 jQuery addClass 调用使用标准 JS 承诺