Javascript 确保在数组中同步执行嵌套数组(Promise.all-in Promise.all)
我在确保在另一个数组中执行的数组的同步执行方面遇到了问题。第一个数组没有直接链接到“嵌套”数组-它只是确保第二个(“嵌套”)数组的执行次数与第一个数组的执行次数相同。文件 为了说明这个问题,这里是我正在谈论的代码Javascript 确保在数组中同步执行嵌套数组(Promise.all-in Promise.all),javascript,asynchronous,promise,mean-stack,Javascript,Asynchronous,Promise,Mean Stack,我在确保在另一个数组中执行的数组的同步执行方面遇到了问题。第一个数组没有直接链接到“嵌套”数组-它只是确保第二个(“嵌套”)数组的执行次数与第一个数组的执行次数相同。文件 为了说明这个问题,这里是我正在谈论的代码 Promise.all( room.connections.map(connection => { Question.find({room: room.title}).then(questions => { return Promis
Promise.all(
room.connections.map(connection => {
Question.find({room: room.title}).then(questions => {
return Promise.all(
questions.map(question => {
if (question.answers.length !== 2) {
question.answers.push({ email: connection.userId, own: "", guess: "" });
console.log('SAVE ANSWER');
return question.save();
}
}),
)
});
})
).then(() => {
console.log('SENDING GAME READY TO BOTH!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!');
io.of("/game")
.in(room.title)
.emit("GameReady", true);
ack(false);
})
如你所见,我将答案插入到一个问题数组中。此外,应该插入尽可能多的答案,因为我在另一个集合中有活跃的联系。
我已经试过上面的代码,但是很明显,第一个promise.all会在迭代通过的两个连接之后立即解决,而不保证所有答案都已插入/保存。
最初,我试图在没有第一个承诺的情况下完成整个过程。all-但问题是“socket.emit”部分将执行两次(因为我的数组中通常有两个连接)。最外层的lambda(连接=>{…}
)有一个语句体(因为主体被花括号包围),但是不包含return
语句,因此表达式room.connections.map(…)
的计算结果是一个充满未定义值的集合。类似于Promise.all([undefined])
的东西会立即解决
尝试返回问题。从外部lambda查找(…)
。这样,对Promise.all的最外层调用将作为参数接收一个正确填充了promises的集合