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中的循环返回值?_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

从JavaScript中的循环返回值?

从JavaScript中的循环返回值?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在创建一个函数来删除与数据库中所需“级别”数量不匹配的索引,然后返回该数组 问题是当我做了cleanWinners(winners,guild)。然后(res=>console.log(res))我收到了未定义的消息。我假设代码没有在返回数组之前等待此函数结束?我怎样才能解决这个问题 当我使用此代码时: async function cleanWinners(winners, guild) { let returnedArray; for (const winner of

我正在创建一个函数来删除与数据库中所需“级别”数量不匹配的索引,然后返回该数组

问题是当我做了
cleanWinners(winners,guild)。然后(res=>console.log(res))
我收到了未定义的消息。我假设代码没有在返回数组之前等待此函数结束?我怎样才能解决这个问题

当我使用此代码时:

async function cleanWinners(winners, guild) {
    let returnedArray;

    for (const winner of winners) {
        XP.findOne({serverID: guild.id, userID: winner}, (err, xpTable) => {
            if (err) throw err;
            if (!xpTable) {
                const newXP = new XP({
                    totalXP: 0,
                    xp: 0,
                    level: 0,
                    date: 0,
                    serverID: guild.id,
                    userID: winner
                });
                newXP.save().catch(console.log);
                xpTable = newXP;
            }
            // If they have less than the set amount, get a new winner.
            if (xpTable.level < 1) {
                const index = winners.indexOf(winner);
                delete winners[index];
            }
            console.log('Removed less than level 1', winners);
            let newWinner = getWinners(winners, 1);
            winners = winners.concat(newWinner);
            console.log('New Winner array:', winners);
            returnedArray = winners;
        });
    }
    return returnedArray;
}
// 503418431861948418 should be removed, the other should stay.
// This code returns undefined before the loop even starts. I want this to run AFTER the loop has completed, no matter the amount of entries the array has.
cleanWinners(['209797091457761280','503418431861948418'], message.guild.id)
.then(res => console.log(res));
异步函数cleanWinners(winners,guild){
让我们回到阵列;
for(优胜者中的康斯特优胜者){
findOne({serverID:guild.id,userID:winner},(err,xpTable)=>{
如果(错误)抛出错误;
如果(!xpTable){
const newXP=新XP({
totalXP:0,
xp:0,
级别:0,
日期:0,
serverID:guild.id,
userID:winner
});
newXP.save().catch(console.log);
xpTable=newXP;
}
//如果他们少于设定的数量,获得一个新的赢家。
如果(xpTable.level<1){
const index=winners.indexOf(winners);
删除获奖者[索引];
}
console.log('删除级别低于1',赢家);
让newWinner=getWinners(winners,1);
winners=winners.concat(newWinner);
log('newwinner数组:',winners);
返回阵列=优胜者;
});
}
返回阵列;
}
//503418431861948418应移除,另一个应保留。
//此代码在循环开始之前返回undefined。我希望它在循环完成后运行,而不管数组有多少个条目。
cleanWinners(['209797091457761280','503418431861948418',message.guild.id)
.then(res=>console.log(res));
这是我在控制台中得到的结果:

undefined
Less than 1 level removed [ '209797091457761280', '503418431861948418' ]
New winners array [ '209797091457761280', '503418431861948418' ]
Less than 1 level removed [ '209797091457761280', <1 empty item> ]
New winners array [ '209797091457761280', <1 empty item> ]```

未定义
移除的级别少于1级['209797091457761280','503418431861948418']
新winners阵列['209797091457761280','503418431861948418']
删除的级别少于1级['209797091457761280',]
新winners阵列['209797091457761280',]```

问题在于XP。findOne函数是异步的,您向它传递了回调。因此,它不会等到一切都完成后才返回returnedArray。 您应该在findOne上使用await
await XP.findOne(…
那么您的代码将以您期望的方式工作

如果您想签出,这里有一个很好的mozilla异步等待链接

当您将
console.log(res)
更改为
console.log
时会发生什么?这是Javascript中一个典型的异步问题调用是异步的,它们将在稍后完成。此外,函数将在获得任何值之前返回。您可能应该切换到数据库的promise接口(不再进行普通回调)然后使用
wait
for
循环中的数据库操作排序,或者,如果要并行运行,请使用
Promise.all()
。关于此主题,这里可能有数百个重复的问题,可以为您提供如何解决此问题的示例。谢谢!我没有意识到XP.findOne是异步的。