【问题标题】:FIrebase jQuery .on method is updating array values one by one rather than all at onceFIrebase jQuery .on 方法是一个一个地更新数组值,而不是一次全部更新
【发布时间】:2018-07-27 04:06:22
【问题描述】:

我正在尝试在不刷新的情况下更新用户在公司页面上所下订单的值。为此,我使用了 jQuery .on 方法。但是,这会一一返回我为订单生成的数组中的值,而不是一次全部返回。这只是firebase的问题还是只是我的代码。

这是我的代码:

当我得到值时:

 firebase.database().ref('Orders/' + user_id).on('value',  function(snapshot) {
     // Check if the user has any pending orders 
     if (snapshot.val() === null) {
         // No Pending Orders are Present
          $('.order_content-parent').html(' <div class="order_content">Hooray! You have no pending orders!</div>');

     } else {

         // One or more pending orders are present


          console.log(snapshot.val());


      snapshot.forEach(function(child){
           $('.order_content-parent').html(' <div class="order_content"></div>');

          var order = child.val().Order;

var key = child.key;
  console.log('Key is : '+key);
  getOrders(key);

});

当我将值插入数据库时​​:

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
     var myId = user.uid;
     const orders = ['Orders: '];
     $('.postData').each(function() {
    var data = $(this).html();
    orders.push(data);
    var database = firebase.database();
       database.ref('Orders/' + user_id + '/' + myId).set({
    Order: orders
  }, function(error) {
    if (error) {
      // The write failed...
      alert(error);
    } else {
         $('.postData').html('Connecting...');

    }
  });
     database.ref('Orders/' + myId).set({
    Order: orders,
    For: user_id
  }, function(error) {
    if (error) {
      // The write failed...
      alert(error);
    } else {
         $('.postData').html('Order Successfully Placed!');

    }
  });
  });
  } else {
    // No user is signed in.
  }
});

这是我打印数据库中的值时的控制台:

这是我的数据库结构:

谁能帮忙

提前致谢,

汤姆

【问题讨论】:

    标签: javascript html firebase firebase-realtime-database


    【解决方案1】:

    我认为这是预期的行为,正如 documentation 所述:

    每次在指定的数据库引用处更改数据时都会调用 value 事件,包括对子项的更改。

    由于您的插入位于 each 循环中,它们会被一一插入,从而多次触发 .on() 侦听器。

    您可以尝试一次插入所有订单。请尝试这种方法,让我知道它是否有效:

    firebase.auth().onAuthStateChanged(function (user) {
        if (!user) {
            console.log("No user is signed in");
            return;
        }
        var myId = user.uid;
        var orders = [];
    
        // Get the orders to insert first
        $('.postData').each(function () {
            var data = $(this).html();
            orders.push(data);
        });
    
        // Then, insert them all at once
        var database = firebase.database();
        database.ref('Orders/' + user_id + '/' + myId).set({
            Order: orders
        }, function (error) {
            if (error) {
                // The write failed...
                alert(error);
                return;
            } 
            $('.postData').html('Connecting...');
            database.ref('Orders/' + myId).set({
                Order: orders,
                For: user_id
            }, function (error) {
                if (error) {
                    // The write failed...
                    alert(error);
                    return;
                } 
                $('.postData').html('Order Successfully Placed!');
            });
        });
    });
    

    【讨论】:

    • 它有效,但请您在代码中解释退货的原因
    • 当然,return 会在此之前停止函数中的代码执行。我在这里首先使用它们来处理错误,以避免使用一些else 子句,使代码在我看来更加“干净”和可读。当然,如果您喜欢这种方式,您可以返回if else。你可以在这里阅读相关文章:geeksforgeeks.org/writing-clean-else-statements
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多