then 语句中的异步 Mongoose 回调
Posted
技术标签:
【中文标题】then 语句中的异步 Mongoose 回调【英文标题】:Async Mongoose callbacks in then statement 【发布时间】:2017-10-09 10:08:13 【问题描述】:我在使用来自 Mongoose
的 Promise 和异步调用时遇到问题
这是我的代码
req.checkBody(BookManager.SCHEME);
req.getValidationResult()
.then(function (result)
if (!result.isEmpty())
handler.onError('Invalid payload');
return;
return new BookModel(
author: data.author,
name: data.name,
year: data.year
);
)
.then((book) =>
BookModel.find(name: book.name, function (err, docs)
if (docs.length)
throw new Error("Book already exists");
else
return book;
);
)
.then((book) =>
book.save();
)
.then((saved) =>
handler.onSuccess(saved);
)
.catch((error) =>
handler.onError(error.message);
);
从上面的代码可以看出。我正在检查这样的书是否已经存在,为了做到这一点,我使用了在主“程序计数器”走得更远之后调用的异步查找方法。
我该如何解决这个问题?
另外请告诉我是否选择了正确的等待来实现我的用例?也许我做错了,还有其他一些最佳实践来处理这个问题。
【问题讨论】:
handler
是什么东西?你应该return
你的承诺!
【参考方案1】:
我相信你的第二个then(..)
应该看起来更像这样:
.then(function(book)
return new Promise(function(resolve, reject)
BookModel.find( name: book.name , function(err, docs)
if (docs.length)
reject(message: "Book already exists");
else
resolve(book);
);
);
)
【讨论】:
谢谢,看来这是解决问题的办法了【参考方案2】:您不得将回调传递给BookModel.find()
来取回承诺。此外,您一定不要忘记 return
来自您的 then
回调的承诺以继续链接:
req.getValidationResult().then(result =>
if (!result.isEmpty())
throw 'Invalid payload';
return new BookModel(
author: data.author,
name: data.name,
year: data.year
);
).then(book =>
BookModel.find(name: book.name).then(docs =>
book
, err =>
throw new Error("Book already exists");
)
).then(book =>
book.save()
).then(handler.onSuccess, handler.onError);
我还修复了your problem with the invalid payload。
【讨论】:
感谢您的回答,但没有保存它不会传递下一个 then 语句的参数。 @e109848 “不保存”是什么意思?以上是关于then 语句中的异步 Mongoose 回调的主要内容,如果未能解决你的问题,请参考以下文章