最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Firebase:创建FIFO库存以获取价值

IT培训 admin 15浏览 0评论

Firebase:创建FIFO库存以获取价值

我已经被这个问题困扰了一个月。

我一直在尝试使用Firebase创建FIFO库存。我正在使用Firebase云功能更新FIFO库存。但是,如果我对插入(推)和移除(弹出)的for循环仅用for循环进行10次压力测试,则由于并发更新而中断。

有人对此有其他解决方案吗?

插入FIFO / PUSH:

let fifoRef = admin.database().ref('fifo/' + item.itemId + '/').push();
let fifo = {
    price: data.items[uniqueId].price,
    in: data.items[uniqueId].quantity,
    quantity: data.items[uniqueId].quantity,
}
fifoRef.set(fifo);

获取FIFO值/ POP(这里我只是更新POP的数量):

// get fifo
let fifoReference = 'fifo/' + item.itemId;
let fifoRef = admin.database().ref(fifoReference);
fifoRef.once('value').then(currentData => {
  let fifo = currentData.val();

  for (let key in fifo) {
    let val = fifo[key];

    if (val.quantity > 0) {
    // get fifo quantity
    let fifoQuantityRef = admin.database().ref(fifoReference + '/' + key + '/quantity/');

    // get local cache value
    let fifoQuantityListener = fifoQuantityRef.on('value', () => {                                      
      // transaction start
      fifoQuantityRef.transaction(function (quantity) {
        if (quantity) {
          if (quantity > 0 && quantitySubtotal > 0) {

            if (quantity >= quantitySubtotal) {
              // minus inventory amount
              let amount = calculator(quantitySubtotal + "*" + val.price);

              quantity = calculator(quantity + "-" + quantitySubtotal);
              quantitySubtotal = 0;

              // update quantity
              return quantity;
            } else {
              let amount = calculator(quantity + "*" + val.price);

              quantitySubtotal = calculator(quantitySubtotal + "-" + quantity);
              return 0;
            }
          }
        }
        return quantity;
      }, (error, committed, result) => {
        fifoQuantityRef.off('value', fifoQuantityListener);
    }, true);
  });

集思广益:我只需要了解如何使用FIFO获取值。据我了解,Firebase最好用于不随事务插入和删除。但是,如果我仅使用插入和删除,如何创建FIFO?如果我创建数量为1的FIFO,则存储的数据将太大。

我曾尝试使用Google数据存储,但是数据存储的持久性非常慢(写入过程超过2秒)。持续时间少于1秒的Firebase无法使用该功能。当在1秒钟内完成PUSH和POP,但尚未持久存储数据存储区时,就会出现问题。

还有其他集思广益的想法吗?

我已经被这个问题困扰了一个月。我一直在尝试使用Firebase创建FIFO库存。我正在使用Firebase云功能更新FIFO库存。但是,如果我进行压力测试...

回答如下:

使用下面的链接查看是否可以解决:

Firebase:创建FIFO库存以获取价值

我已经被这个问题困扰了一个月。

我一直在尝试使用Firebase创建FIFO库存。我正在使用Firebase云功能更新FIFO库存。但是,如果我对插入(推)和移除(弹出)的for循环仅用for循环进行10次压力测试,则由于并发更新而中断。

有人对此有其他解决方案吗?

插入FIFO / PUSH:

let fifoRef = admin.database().ref('fifo/' + item.itemId + '/').push();
let fifo = {
    price: data.items[uniqueId].price,
    in: data.items[uniqueId].quantity,
    quantity: data.items[uniqueId].quantity,
}
fifoRef.set(fifo);

获取FIFO值/ POP(这里我只是更新POP的数量):

// get fifo
let fifoReference = 'fifo/' + item.itemId;
let fifoRef = admin.database().ref(fifoReference);
fifoRef.once('value').then(currentData => {
  let fifo = currentData.val();

  for (let key in fifo) {
    let val = fifo[key];

    if (val.quantity > 0) {
    // get fifo quantity
    let fifoQuantityRef = admin.database().ref(fifoReference + '/' + key + '/quantity/');

    // get local cache value
    let fifoQuantityListener = fifoQuantityRef.on('value', () => {                                      
      // transaction start
      fifoQuantityRef.transaction(function (quantity) {
        if (quantity) {
          if (quantity > 0 && quantitySubtotal > 0) {

            if (quantity >= quantitySubtotal) {
              // minus inventory amount
              let amount = calculator(quantitySubtotal + "*" + val.price);

              quantity = calculator(quantity + "-" + quantitySubtotal);
              quantitySubtotal = 0;

              // update quantity
              return quantity;
            } else {
              let amount = calculator(quantity + "*" + val.price);

              quantitySubtotal = calculator(quantitySubtotal + "-" + quantity);
              return 0;
            }
          }
        }
        return quantity;
      }, (error, committed, result) => {
        fifoQuantityRef.off('value', fifoQuantityListener);
    }, true);
  });

集思广益:我只需要了解如何使用FIFO获取值。据我了解,Firebase最好用于不随事务插入和删除。但是,如果我仅使用插入和删除,如何创建FIFO?如果我创建数量为1的FIFO,则存储的数据将太大。

我曾尝试使用Google数据存储,但是数据存储的持久性非常慢(写入过程超过2秒)。持续时间少于1秒的Firebase无法使用该功能。当在1秒钟内完成PUSH和POP,但尚未持久存储数据存储区时,就会出现问题。

还有其他集思广益的想法吗?

我已经被这个问题困扰了一个月。我一直在尝试使用Firebase创建FIFO库存。我正在使用Firebase云功能更新FIFO库存。但是,如果我进行压力测试...

回答如下:

使用下面的链接查看是否可以解决:

发布评论

评论列表 (0)

  1. 暂无评论