【发布时间】:2021-03-04 15:36:23
【问题描述】:
我正在使用 q 并且我有多个 mongoose .exec() 承诺永远不会到达代码的 .then() 部分,所以永远不要让 q 解决。无法弄清楚为什么它永远不会回来。
var defer = q.defer();
var promises = [];
console.log('Exams:', exams.length);
for (var e=0; e<exams.length; e++) {
console.log('Exams:', exams[e]._id);
var newPromise = Pupilexam.find({ _exam: exams[e]._id }).populate('_user').exec()
.then((pupils) => {
console.log("Adding pupils", exams[e]._id);
exams[e].pupils = pupils;
resolve(exams[e]);
})
.catch((err) => {
reject(err);
});
console.log(typeof newPromise);
promises.push(newPromise);
console.log("Promised pushed");
}
q.all(promises).then(function(data){
console.log("q'd all");
defer.resolve(res.status(200).json(exams));
});
return defer;
Pupilexam.find().exec() 永远不会到达 .then(),因此承诺永远不会解决,而延迟永远不会解决。为什么猫鼬会找不到.then()?我错过了什么?
*** 更新 ***
即使使用内置的 Promise,我们也会遇到同样的问题。 Pupilexams.find() 电话永远不会回来。
var promises = [];
for (var e=0; e<exams.length; e++) {
console.log('e:', e);
console.log('Exam', exams[e]._id);
var newPromise = Pupilexam.find({ _exam: exams[e]._id }).populate('_user').exec()
.then((pupils) => {
console.log("Adding pupils", exams[e]._id);
exams[e].pupils = pupils;
})
.catch(handleError(res));
promises.push(newPromise);
}
Promise.all(promises).then((exams) => {
console.log(values);
res.status(200).json(exams)
});
使用这种方法,我在调用 UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 时也会收到标题错误
** 需要额外的代码 **
function handleError(res, statusCode) {
statusCode = statusCode || 500;
return function(err) {
console.log(err.message);
res.status(statusCode).send(err);
};
}
【问题讨论】:
-
请问使用
q-promises 有什么特别的原因吗?Promise.all通过本机承诺开箱即用地支持。 -
避免使用deferred antipattern (
q.defer()) 和Promiseconstructor antipattern (resolve(exams[e]);,reject(err);)! -
你的逻辑不对。如果了解您有一系列考试。您希望每次考试都将学生的数据添加到考试对象中。每个考试数组都是一个对象数组,您可以添加到每个对象属性,包括学生的信息。如果您需要处理来自 mongo 的错误,请再次调用它。在与学生信息进行考试之后。没有你的逻辑。另外如果你只是从mongo读取数据,推荐使用lean函数,
-
@eol 习惯。我在别处用过。但是当我使用 promises.all 时,我遇到了同样的问题。循环中的猫鼬调用永远不会返回并运行
.then()代码。 -
@Bergi 我已经更新了 promises.all 以避免,但遇到同样的问题。
标签: node.js mongoose promise q