Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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 如何设置多个firebase.on()侦听器和触发器函数_Javascript_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript 如何设置多个firebase.on()侦听器和触发器函数

Javascript 如何设置多个firebase.on()侦听器和触发器函数,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我在不同的节点上设置了多个on侦听器,以获取生成某些数据表所需的数据。侦听器更新后,将重新生成网站上的所有表。问题是,在第一次加载网页时,它必须为每个网页重新生成一次表。在侦听器上,这是过度的。我试着让每一位听众都做出承诺,这样只有在他们都解决了问题之后,我才能运行gen_表,效果很好,只是听众似乎被叫停了,不再倾听。如何让gen_表在第一次加载时只运行一次,但仍然让我的多个侦听器继续侦听 这是我的代码,它可以工作,但必须运行gen_表6次 下面是使用Promise.all方法等待all.on的

我在不同的节点上设置了多个on侦听器,以获取生成某些数据表所需的数据。侦听器更新后,将重新生成网站上的所有表。问题是,在第一次加载网页时,它必须为每个网页重新生成一次表。在侦听器上,这是过度的。我试着让每一位听众都做出承诺,这样只有在他们都解决了问题之后,我才能运行gen_表,效果很好,只是听众似乎被叫停了,不再倾听。如何让gen_表在第一次加载时只运行一次,但仍然让我的多个侦听器继续侦听

这是我的代码,它可以工作,但必须运行gen_表6次

下面是使用Promise.all方法等待all.on的代码,该方法已决定只运行gen_表一次,但在第一次加载后不继续侦听:

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();
});