gpt4 book ai didi

Javascript Promise 过早解析

转载 作者:太空宇宙 更新时间:2023-11-04 15:47:22 26 4
gpt4 key购买 nike

我有一个返回 Promise 的函数,它访问数据库并取出几行,将它们分配给 Javascript 变量。

问题是,即使我知道 Promise 尚未解决,我的“.then”子句也会被触发:

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”子句在 Promise 本身之前运行)。

我的POST功能仍然和以前一样。

最佳答案

db.collection.find() 函数是异步的,因此您必须解决回调内部的 promise ,例如

function FindPopularRumours() {
return db.collection(HASHTAGS).find().toArray().then( (items) => {
return items.map( doc => doc.hashtag);
});
}

利用 Mongo toArray() 方法,直接返回一个 Promise

关于Javascript Promise 过早解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43450507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com