即使没有错误,Promise 也会被拒绝。 Node.js
Promise gets rejected even though there is no error. NodeJs
所以,我有一段使用 Promises
的代码,我正在使用 bluebird
库。
问题是即使没有错误,我的承诺也会被拒绝。即使是简单的 console.log
,它也会完全跳过 .then
块
下面是使用 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
函数中看到的那样,我在 if(err)
块中放置了一个 console.log
,但它从未运行过,因此我得出结论,我没有收到来自 mongoose 查询的任何错误。
仍然,代码完全跳过了 .then
块,落入了 catch
链。我在 then
块内有一个简单的 console.log
,需要注意的一件有趣的事情是 catch
块内的回调中 err
的值是 [= 的数组42=] 文档。
谁能解释一下,为什么我的代码会以这种方式运行?
感谢您的帮助。
你的 Promise 构造函数回调中 resolve/reject 的顺序是错误的......函数的名称无关紧要,第一个是 resolve,第二个是 reject ...你实际上是在拒绝打电话时承诺 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);
})
})
}
所以,我有一段使用 Promises
的代码,我正在使用 bluebird
库。
问题是即使没有错误,我的承诺也会被拒绝。即使是简单的 console.log
.then
块
下面是使用 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
函数中看到的那样,我在 if(err)
块中放置了一个 console.log
,但它从未运行过,因此我得出结论,我没有收到来自 mongoose 查询的任何错误。
仍然,代码完全跳过了 .then
块,落入了 catch
链。我在 then
块内有一个简单的 console.log
,需要注意的一件有趣的事情是 catch
块内的回调中 err
的值是 [= 的数组42=] 文档。
谁能解释一下,为什么我的代码会以这种方式运行?
感谢您的帮助。
你的 Promise 构造函数回调中 resolve/reject 的顺序是错误的......函数的名称无关紧要,第一个是 resolve,第二个是 reject ...你实际上是在拒绝打电话时承诺 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);
})
})
}