我有一个返回Promise的函数,它访问数据库并拉出几行,将它们分配给一个Javascript变量。
问题是我的'然后'即使我知道承诺没有得到解决,也会触发条款:
app.post("/api/hashtag", function (req, res) {
FindPopularRumours().then(function (resolveVar) {
console.log(resolveVar);
console.log();
res.send(resolveVar);
}).catch(function () {
console.log("DB Error!");
res.send("DB Error!");
});
});
承诺功能:
function FindPopularRumours() {
return new Promise((resolve, reject) => {
var hashtags = [];
var dbPromise;
db.collection(HASHTAGS).find().forEach(function (doc) {
hashtags.push(doc.hashtag);
console.log(hashtags);
});
resolve(hashtags);
});
}
结果输出为:
[]
['#TEST1']
[' #test1',' #test2']
[' #test1',' #test2',' #test3']
如您所见,第一行(' []')只应在输出主题标签后执行。但出于某种原因,我的代码似乎认为Promise在它实际存在之前就已经解决了。
根据Ankit的建议,我已将我的功能修改为:
function FindPopularRumours() {
return new Promise((resolve, reject) => {
var hashtags = [];
db.collection(HASHTAGS).find({}, function (err, doc) {
if (!err) {
doc.forEach(function (arg) {
hashtags.push(arg.hashtag);
console.log(hashtags);
});
resolve(hashtags);
} else {
return reject(err);
}
});
});
}
这仍然会返回与之前相同的输出响应(例如,'然后'子句在promise本身之前运行)。
我的POST功能仍然与之前相同。
答案 0 :(得分:1)
db.collection.find()
函数是异步的,因此您必须解决内部的回复,例如
function FindPopularRumours() {
return db.collection(HASHTAGS).find().toArray().then( (items) => {
return items.map( doc => doc.hashtag);
});
}
利用Mongo toArray()
方法,直接返回一个承诺
答案 1 :(得分:0)
请注意db.collection(HASHTAGS).find()
是异步调用。因此,您的承诺在数据库查询返回之前得到解决。要解决此问题,您需要重新编写数据库查询,如下所示:
function FindPopularRumours() {
return new Promise((resolve, reject) => {
var hashtags = [];
var dbPromise;
db.collection(HASHTAGS).find({}, function(err, doc){
if(!err){
doc.forEach(function (arg) {
hashtags.push(arg.hashtag);
console.log(hashtags);
});
resolve(hashtags);
}else{
return reject(err);
}
});
});
}
希望答案可以帮到你!