所以,我有一段使用Promises
的代码,我正在使用bluebird
库。
问题是即使没有错误,我的承诺也会被拒绝。即使是简单的.then
console.log
块
以下是使用promise的代码:
function returnMeetings(query) {
return new Promise((reject, resolve) => {
Meeting.find(query, (err, foundMeetings) => {
if (err) {
console.log("We have a error")
reject(err);
}
resolve(foundMeetings);
})
})
}
以下是使用returnMeetings
函数
returnMeetings(query)
.then((data) => {
console.log("here we are")
// while (count < stopAt) {
// let localData = [];
// if (req.params.duration === 'monthly') {
// let {
// date1,
// date2
// } = twoDates(count, count);
// localData = data.filter((el) => {
// if (el.startDate) {
// let localDate = new Date(el.startDate);
// if (localDate >= date1 && localDate <= date2) {
// return el;
// }
// }
// })
// if (localData) {
// data.push({
// data: localData,
// month: count
// })
// }
//
// if (count === stopAt - 1) {
// myEmitter.emit('found all meetings')
// } else {
// count++;
// }
// }
// }
}).catch((err) => {
res.status(500).json({
message: err
})
})
正如您在returnMeetings
函数中看到的那样,我在console.log
块中放置了一个if(err)
,并且它永远不会运行,因此我得出结论,我没有收到任何错误来自mongoose查询。
然而,代码完全跳过.then
块,并进入catch
链。我在console.log
块中有一个简单的then
,有一点需要注意的是err
块内回调中catch
的值是一个mongodb文档数组
有人可以解释一下,为什么我的代码会以这种方式运行?
感谢您的帮助。
答案 0 :(得分:2)
你的Promise构造函数回调中的解析/拒绝顺序是错误的...函数的名称是无关紧要的,第一个是解决,第二个是拒绝......你实际上是在拒绝承诺resolve
即。你可以
return new Promise((fred, wilma) => {
然后要解决承诺,您可以致电fred(value)
并拒绝接听wilma(error)
换句话说,你给回调参数的名字是无关紧要的,位置是相关的
按如下方式更改您的代码:
function returnMeetings(query) {
return new Promise((resolve, reject) => {
Meeting.find(query, (err, foundMeetings) => {
if (err) {
console.log("We have a error")
reject(err);
}
resolve(foundMeetings);
})
})
}