遍历数组并等待处理诺言"/>
遍历数组并等待处理诺言
我正在创建一个待办事项应用程序,我希望每个待办事项列表都具有唯一的名称。每个用户都有一个待办事项列表数组。传入的POST请求(用于创建新列表)具有附加的用户对象,因此我可以使用const userLists = req.user.list
获取数组。这(如果我在控制台上登录)是每个列表_id
。
我正在尝试遍历这些对象以获得列表对象,并测试名称以查看其是否等于req.body.name
以确保唯一性。
我宁愿保留函数async
,因为我在下面有更多逻辑,并且不希望嵌套太多回调函数。
我尝试过
exports.createList = async (req, res) => {
const usersLists = req.user.lists;
let proms = [];
let found = false;
userLists.map(list => {
const listObj = List.findOne({_id : list});
if(listObj.name === req.body.name)
found = true
})
(other code below to create list)
并且也尝试await List.findOne()
,但我无法async
地图。
我相信代码正在运行,因此found
永远都不是。
然后我在网上看到了使用Promise.all()
的内容,因此我尝试了此操作:
let proms = []
usersLists.map(listId => {
proms.push(List.findOne({_id: listId}, "name").exec());
});
await Promise.all(proms.map(p => {
if(p.name == req.body.name)
found = true;
}))
但是下面的代码仍然运行,并且列表已创建。如果i console.log(proms)
则由[object Promise]的数组组成。
对我来说,这仍然是很新的东西,我要做的就是遍历一个列表ID的数组,获取列表对象并测试以查看是否有任何列表名称等于我想要的新列表的名称创建(并返回错误)
任何帮助将不胜感激。谢谢
回答如下:让我在这里分解问题
let proms = []
usersLists.map(listId => {
proms.push(List.findOne({_id: listId}, "name").exec());
});
await Promise.all(proms.map(p => {
if(p.name == req.body.name)
found = true;
}))
首先,
let proms = []
usersLists.map(
将返回一个新数组,因此您不需要let proms = []
并将其推入。您也可以在地图回调中使用async/await
。您可以做的是
const promises = usersLists.map(async listId => {
const prom = await List.findOne({_id: listId}, "name").exec();
if(p.name == req.body.name) // I put this here so we don't have to make another loop
found = true;
});
当映射循环完成时,promises
将是一个promise数组。因此,为了使javascript等待所有这些承诺,您现在将使用Promise.all(promises)
。为此,这是如何
await Promise.all(promises);
然后您走,最后的输出
const promises = usersLists.map(async listId => {
const prom = await List.findOne({_id: listId}, "name").exec();
if(p.name == req.body.name)
found = true;
});
await Promise.all(promises);
更多推荐
遍历数组并等待处理诺言
发布评论