【发布时间】:2017-05-08 15:00:59
【问题描述】:
我有一个返回 Promise 的函数,它访问数据库并拉出几行,将它们分配给 Javascript 变量。
问题是我的 '.then' 子句被触发,即使我知道 Promise 尚未解决:
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!");
});
});
还有 Promise 函数:
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 在实际解决之前就已经解决了。
编辑1
根据 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);
}
});
});
}
这仍然返回与以前相同的输出响应(例如,'then' 子句在承诺本身之前运行)。
我的POST功能还是和以前一样。
【问题讨论】:
-
当然,因为你确实在加载数据之前解决了承诺。
db.collection(HASHTAGS).find()是异步的。
标签: javascript mongodb promise