NodeJs 推入数组在异步函数中不起作用

Posted

技术标签:

【中文标题】NodeJs 推入数组在异步函数中不起作用【英文标题】:NodeJs push in array not working within the async function 【发布时间】:2021-10-02 07:10:31 【问题描述】:

这是我的代码...

var schedule =new Schedule(
            
                flightNumber: req.body.flightNumber,
                status: req.body.status,
                pickDateTime: req.body.pickDateTime,
            );

            if(req.body.passenger.length > 0)

                await req.body.passenger.forEach(async function (data) 
                    var driver
                    await Driver.findOneAndUpdate(area:data.location_code,$expr:  $gt:["$vehicle_capacity", "$capacity_occupied"], $inc:  capacity_occupied: +1  ).then((drivers) => 
                        driver = drivers._id
                    );                 
                    await schedule.passenger.push(
                        driver: driver,
                        dropLocation: req.body.dropLocation,
                        droplong: req.body.droplong,
                        picklong: data.long
                    )
                );
            
            console.log(schedule.passenger);

当我尝试访问异步函数内部的 schedule.passenger 时,它正在工作,但是当我尝试访问异步函数外部时,它不起作用。

【问题讨论】:

重复Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference 嗯,它与异步有关,我无法理解你为什么在数组函数中使用 await。我很好奇。 【参考方案1】:

forEach(async function 将触发一堆异步函数,一旦数组迭代完成,执行将移至下一个代码块,而无需等待所有异步函数完成。

这可以通过使用map 函数并返回承诺并等待所有这些来解决。

let allPromises = req.body.passenger.map(async function (data) 
 //your code goes here
);

Promise.allSettled(allPromises).then(() => 
 console.log(schedule.passenger);
);

另外await schedule.passenger.push( 也不正确,因为Array.prototype.push() 不是异步操作。

【讨论】:

是不是也和变量作用域有关? 哪个变量? schedule.passenger,我也看不到对象中的乘客数组。 因为schedule 在外部范围内,因此可以添加属性并将其可用。但是await schedule.passenger.push( 不正确,因为Array.prototype.push() 不是异步操作。 @RajdeepDebnath 你是个了不起的男孩......谢谢你让我开心

以上是关于NodeJs 推入数组在异步函数中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Console.log 在异步函数中不起作用

等待似乎不起作用,异步(nodejs)

使用数组过滤器更新多个嵌套数组在猫鼬中不起作用

附加函数在调整大小的数组中不起作用

离子 3 中的阵列推入不起作用

温斯顿记录器在nodejs中不起作用