Javascript 如何设置多个firebase.on()侦听器和触发器函数
我在不同的节点上设置了多个on侦听器,以获取生成某些数据表所需的数据。侦听器更新后,将重新生成网站上的所有表。问题是,在第一次加载网页时,它必须为每个网页重新生成一次表。在侦听器上,这是过度的。我试着让每一位听众都做出承诺,这样只有在他们都解决了问题之后,我才能运行gen_表,效果很好,只是听众似乎被叫停了,不再倾听。如何让gen_表在第一次加载时只运行一次,但仍然让我的多个侦听器继续侦听 这是我的代码,它可以工作,但必须运行gen_表6次 下面是使用Promise.all方法等待all.on的代码,该方法已决定只运行gen_表一次,但在第一次加载后不继续侦听:Javascript 如何设置多个firebase.on()侦听器和触发器函数,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我在不同的节点上设置了多个on侦听器,以获取生成某些数据表所需的数据。侦听器更新后,将重新生成网站上的所有表。问题是,在第一次加载网页时,它必须为每个网页重新生成一次表。在侦听器上,这是过度的。我试着让每一位听众都做出承诺,这样只有在他们都解决了问题之后,我才能运行gen_表,效果很好,只是听众似乎被叫停了,不再倾听。如何让gen_表在第一次加载时只运行一次,但仍然让我的多个侦听器继续侦听 这是我的代码,它可以工作,但必须运行gen_表6次 下面是使用Promise.all方法等待all.on的
const listener = (ref) => {
return new Promise((resolve, reject) => {
const onError = (error) => reject(error);
const onData = (snap) => resolve(snap.val());
db.ref(ref).on("value", onData, onError);
});
};
let listeners = [
listener("orders_meta"),
listener("orders_next_week"),
listener("orders_processing"),
listener("products"),
listener("products_meta"),
listener(`weeks/${currentweek}`),
];
Promise.all(listeners).then(function (values) {
console.log(values);
orders_meta = values[0];
orders_next_week = values[1];
orders_processing = values[2];
products = values[3];
products_meta = values[4];
currentWeekData = values[5];
gen_tables();
});
你应该重新思考你的架构。因为您没有向gen_表传递任何值,所以我假设它会更新所有表,对吗?在这种情况下,为什么不设置云调度器每n分钟触发一次的云函数来执行gen_表呢 如果只希望在发生更新时调用gen_表,请在发生写入时使用.on侦听器将数据库中的值设置为1,并且在云函数执行时,仅在该值为1时调用gen_表
如果您想要更细致的更新,请使用您的.on侦听器使用要更新的表名更新队列,然后让云计划程序触发的云功能每n分钟检查一次更新并处理这些更新。您应该重新考虑您的体系结构。因为您没有向gen_表传递任何值,所以我假设它会更新所有表,对吗?在这种情况下,为什么不设置云调度器每n分钟触发一次的云函数来执行gen_表呢 如果只希望在发生更新时调用gen_表,请在发生写入时使用.on侦听器将数据库中的值设置为1,并且在云函数执行时,仅在该值为1时调用gen_表
如果您想要更细致的更新,请使用您的.on侦听器使用要更新的表名更新队列,然后让云计划程序触发的云功能每n分钟检查一次更新并处理这些更新。我正在将信息传递给gen_表,但只需使用新信息设置一个全局变量,gen_表就会使用这些全局变量。我故意使用实时数据库,我需要在编辑数据时更新表。gen_表在一个会话中将被调用一百次。问题是您的方法引入了严重的竞争条件。假设两个独立的用户同时更新RTDB。当一半更新来自用户1,另一半来自用户2时,它可能会运行genu表,并且在更新完全传播之前,它可能会运行genu表。如果规模是一项要求,则上述建议或甚至更好的排队体系结构可能是首选。祝你好运非常感谢。我欣赏发人深省的观点,因为我是编程新手。然而,这不是除了问题的重点之外的架构问题吗?只有在从两个不同的来源接收数据后才进行计算,同时还要继续侦听更改,这难道不是比较常见的做法吗?我不知道我不知道的是什么:我正在将信息传递给gen_表,但只是通过使用新信息设置一个全局变量,然后gen_表使用这些全局变量。我故意使用实时数据库,我需要在编辑数据时更新表。gen_表在一个会话中将被调用一百次。问题是您的方法引入了严重的竞争条件。假设两个独立的用户同时更新RTDB。当一半更新来自用户1,另一半来自用户2时,它可能会运行genu表,并且在更新完全传播之前,它可能会运行genu表。如果规模是一项要求,则上述建议或甚至更好的排队体系结构可能是首选。祝你好运非常感谢。我欣赏发人深省的观点,因为我是编程新手。然而,这不是除了问题的重点之外的架构问题吗?只有在从两个不同的来源接收数据后才进行计算,同时还要继续侦听更改,这难道不是比较常见的做法吗?我不知道什么我不知道:
const listener = (ref) => {
return new Promise((resolve, reject) => {
const onError = (error) => reject(error);
const onData = (snap) => resolve(snap.val());
db.ref(ref).on("value", onData, onError);
});
};
let listeners = [
listener("orders_meta"),
listener("orders_next_week"),
listener("orders_processing"),
listener("products"),
listener("products_meta"),
listener(`weeks/${currentweek}`),
];
Promise.all(listeners).then(function (values) {
console.log(values);
orders_meta = values[0];
orders_next_week = values[1];
orders_processing = values[2];
products = values[3];
products_meta = values[4];
currentWeekData = values[5];
gen_tables();
});