我一直在尝试将对象插入异步函数的数组中,但是它 返回空数组作为nodejs中的输出,猫鼬
var data = [];
app.get("/api/post", async (req, res) => {
const post = await UserPost.find();
post.forEach(async element => {
const email = await element.userid;
const user = await Account.find({ email });
const usern = await user[0].username;
var userobject = {
element,
usern
};
//Promise.all(userobject)
data.push(userobject);
});
console.log(data);
res.send({ data });
});
答案 0 :(得分:0)
看来您在兑现诺言。为了实现此特定方案,可以使用Promise.all
和Array.map
。
这是我为您编辑的代码:
(*请注意,为了说明起见,这只是一个伪代码)
app.get("/api/post", async (req, res) => {
try {
const posts = await dummyPromiseResolver(); // first promise
const promises = posts.map(async element => {
const user = await dummyEmailReturn(element.userid); // second promise
const usern = user[0].username;
return {
usern,
...element
};
});
const fresult = await Promise.all(promises);
res.send(fresult);
} catch (error) {
console.error("error in posts fetch:" + error);
}
});
如果我描述这段代码,由于我们需要遍历数组中的每个对象并且需要从单独的promise添加值,因此posts.map正在创建一个promise数组。
然后Promise.all
可以执行您的promise数组,并返回具有所需结果的最终结果数组。
注意:您也可以使用for … of
,但是当我们需要并行进行操作时,可以使用Promise.all
。您可以从此thread中找到更多信息。
这是代码沙箱的链接:https://codesandbox.io/embed/serverless-cookies-nu4h0
请注意,我添加了dummyPromiseResolver
和dummyEmailReturn
,它们分别等于UserPost.find()
和Account.find()
函数。除此之外,我还删除了代码中一些不必要的等待。我添加了一个try catch块来捕获任何异常。您可以根据需要更改尝试捕获。
希望这会对您有所帮助。让我知道是否需要更多说明。