Node.js NodeJs&;Firebase嵌套forEach异步等待
我已经开始学习NodeJS与Firebase一起使用它来创建函数 我目前陷入困境,因为我有嵌套的forEach,它必须是异步的 我会尽量让人理解 我有3个节点:Node.js NodeJs&;Firebase嵌套forEach异步等待,node.js,firebase,asynchronous,firebase-realtime-database,async-await,Node.js,Firebase,Asynchronous,Firebase Realtime Database,Async Await,我已经开始学习NodeJS与Firebase一起使用它来创建函数 我目前陷入困境,因为我有嵌套的forEach,它必须是异步的 我会尽量让人理解 我有3个节点: 终端 预订 TerminalBookings(类似于联接表) 我必须创建一个函数来获取所有与预订相关联的终端 所以我必须得到所有终端,对于每个终端,我可以得到所有相关的终端预订(节点键是终端id,所有值都是预订id)。 然后,当我拥有所有的终端预订时,我可以在“预订”节点中获取预订信息 使用Sql看起来很容易,但我可以找到如何使用
- 终端
- 预订
- TerminalBookings(类似于联接表)
const bookingsSnapshot = await getReservationsSnapshotByTerminalId(terminal.key);
如果我想使用wait,父forEach必须是异步的,但这是不可能的
我认为我没有正确的方式来处理这个功能,但是我被卡住了,我不知道怎么做
如果我错了,请随意完全重建此函数。您可以通过以下两种方法之一实现此功能
for await (let terminal of terminals){
await getReservationsSnapshotByTerminalId(terminal.terminalId);
console.log(terminalId);
}
console.log("Done");
输出:
Terminal1
Terminal2
Terminal3
Done
或
同样,输出为:
Terminal1
Terminal2
Terminal3
Done
这个怎么样
const getReservationsSnapshotByTerminalId = (terminalId) => {
return admin.database().ref(`/terminalBookings/${terminalId}`).once('value')
.then(snapshot => {
const terminalReservations = Object.keys(terminalReservationsSnap.val());
const reservationsSnapshot = terminalReservations.map(reservationId => {
return admin.database().ref(`/bookings/${reservationId}`).once('value');
});
return Promise.all(reservationsSnapshot);
});
};
exports.showTerminalsWithReservations = functions.https.onRequest(async (request, response) => {
let terminals = [];
try {
terminals = await admin.database().ref('/terminals/').once('value')
.then(snapshot =>{
const promises = [];
const allTerminals = snapshot.val();
const terminalKeys = Object.keys(allTerminals);
const terminalsArray = terminalKeys.map(key => new Borne(key, allTerminals[key]));
promises.push(terminalsArray);
promises = promises.concat(terminalKeys.map(key => getReservationsSnapshotByTerminalId(key)));
return Promises.all(promises);
})
.then(resultArray => {
const terminalsArray = resultArray[0];
terminalsArray.forEach((terminal, idx) => {
const bookingsSnapshot = resultArray[idx + 1];
bookingsSnapshot.forEach(booking => {
terminal.bookings.push(booking.val());
});
});
return terminalsArray;
});
} catch(error) {
}
});
const getReservationsSnapshotByTerminalId = (terminalId) => {
return admin.database().ref(`/terminalBookings/${terminalId}`).once('value')
.then(snapshot => {
const terminalReservations = Object.keys(terminalReservationsSnap.val());
const reservationsSnapshot = terminalReservations.map(reservationId => {
return admin.database().ref(`/bookings/${reservationId}`).once('value');
});
return Promise.all(reservationsSnapshot);
});
};
exports.showTerminalsWithReservations = functions.https.onRequest(async (request, response) => {
let terminals = [];
try {
terminals = await admin.database().ref('/terminals/').once('value')
.then(snapshot =>{
const promises = [];
const allTerminals = snapshot.val();
const terminalKeys = Object.keys(allTerminals);
const terminalsArray = terminalKeys.map(key => new Borne(key, allTerminals[key]));
promises.push(terminalsArray);
promises = promises.concat(terminalKeys.map(key => getReservationsSnapshotByTerminalId(key)));
return Promises.all(promises);
})
.then(resultArray => {
const terminalsArray = resultArray[0];
terminalsArray.forEach((terminal, idx) => {
const bookingsSnapshot = resultArray[idx + 1];
bookingsSnapshot.forEach(booking => {
terminal.bookings.push(booking.val());
});
});
return terminalsArray;
});
} catch(error) {
}
});