Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中的array.map()内部使用异步方法_Javascript_Node.js_Async Await - Fatal编程技术网

在javascript中的array.map()内部使用异步方法

在javascript中的array.map()内部使用异步方法,javascript,node.js,async-await,Javascript,Node.js,Async Await,我想遍历一个元素数组,然后用“findOne()”函数检查每个元素是否存在一个主题,如果没有,则创建一个新主题并保存它,如果该主题存在,只需应用一些更改,然后保存,我希望它仅在保存主题后继续 internalRoutes.post('/add_questions', (req, res) => { let elements = req.body var count = 0; elements.map((element) => { let q =

我想遍历一个元素数组,然后用“findOne()”函数检查每个元素是否存在一个主题,如果没有,则创建一个新主题并保存它,如果该主题存在,只需应用一些更改,然后保存,我希望它仅在保存主题后继续

internalRoutes.post('/add_questions', (req, res) => {
    let elements = req.body
    var count = 0;
    elements.map((element) => {
        let q = new Question({ category: element.category, body: element.body, level: element.level })
        q.save().then(question => {

            Theme.findOne({ name: element.theme }).then(theme => {
                if (!theme) {
                    let new_theme = new Theme({ name: element.theme, level: element.level, questions: [], first_question: null })
                    new_theme.questions.push(question);
                    new_theme.first_question = question._id;
                    new_theme.save().then(t => {
                        console.log('new theeeeemmmmmmeeeeee')
                    })
                }
                else {
                    theme.questions.push(question);
                    theme.save().then(t => {
                        console.log('yeeeerrrrrrrrrrrrrecognized');
                    })
                }
            })
                .catch(err => {
                    res.status(400).json("couldn't locate theme")
                })
        }).catch(err => {
            res.status(400).json("couldn't save question")
        })
        count++;

    })
    if (count === elements.length) {
        res.status(200).json({ message: "questions added successfully" })
    }
    else res.status(500).json('error')
})

这是我当前的代码,我尝试了很多方法,比如异步等待函数或尝试捕获块,但似乎从来没有解决过这个问题。有人知道问题可能出在哪里吗?

您可能想要某种
承诺。所有的
实现,所以您知道您触发的所有承诺都得到了回报

您的示例代码相当复杂,因此如果您可以简化它,我将能够为您的案例提供更具体的方法

const promisedElements=Promise.all(elements.map(async()=>{…}))。然后(…)

您可能想要某种
承诺。所有的
实现,所以您知道您所做出的所有承诺都得到了回报

您的示例代码相当复杂,因此如果您可以简化它,我将能够为您的案例提供更具体的方法

const promisedElements=Promise.all(elements.map(async()=>{…}))。然后(…)

首先。不要在这里使用
map
。映射是一对一函子。我在这里没有看到任何变化,但看到了很多变异。您应该使用
forEach
。第二,你不需要那个if语句。只需在
new_theme
上执行内联if,并消除重复的代码。最后,请澄清你的问题。我在这段代码中没有看到任何
async/await
。您所说的
保存后继续是什么意思
,在哪里继续?下一步要执行的是什么?如果你决定走这条路,你还需要做一些额外的步骤。例如,map函数需要返回一个Promise,其结果值将是Promise[]。然后你必须做一个等待的承诺。本质上是等待(x)。我曾经做过一次类似的概念,因为我有一个异步函数列表,在应用程序继续之前需要解析这些函数。你的类似问题是通过映射构建异步列表,而不是我创建2-3个特定的异步函数。此函数长36行,缩进6级。这是一个很好的指示,可以将该逻辑划分为几个较小的命名函数。另外:如果您想等到几个并行异步操作全部完成,那么
Promise.all
是您的朋友。我认为您仍然需要等待Promise all的结果,因为当承诺列表中的所有项都解决时,这就解决了。@sinanspd这段代码会对数组的每个元素执行,所以我所说的“继续”是指对当前元素进行保存,然后继续对下一个元素执行同样的操作。不要在这里使用
map
。映射是一对一函子。我在这里没有看到任何变化,但看到了很多变异。您应该使用
forEach
。第二,你不需要那个if语句。只需在
new_theme
上执行内联if,并消除重复的代码。最后,请澄清你的问题。我在这段代码中没有看到任何
async/await
。您所说的
保存后继续是什么意思
,在哪里继续?下一步要执行的是什么?如果你决定走这条路,你还需要做一些额外的步骤。例如,map函数需要返回一个Promise,其结果值将是Promise[]。然后你必须做一个等待的承诺。本质上是等待(x)。我曾经做过一次类似的概念,因为我有一个异步函数列表,在应用程序继续之前需要解析这些函数。你的类似问题是通过映射构建异步列表,而不是我创建2-3个特定的异步函数。此函数长36行,缩进6级。这是一个很好的指示,可以将该逻辑划分为几个较小的命名函数。另外:如果您想等到几个并行异步操作全部完成,那么
Promise.all
是您的朋友。我认为您仍然需要等待Promise all的结果,因为当承诺列表中的所有项都解决时,这就解决了。@sinanspd这段代码会对数组的每个元素执行,所以我所说的“继续”是指对当前元素进行保存,然后对下一个元素继续执行相同的操作