node.js / sqlite - 序列化回调以及主要功能

时间:2013-08-31 19:53:42

标签: javascript node.js serialization sqlite

示例:

包含2行的数据库表:

 rowid name qty date   
 1     milk   3 8/25    
 2     milk  40 8/30    

需要先使用最早的牛奶执行要减去5个牛奶项目的库存交易。

e.g。

选择rowid 1 等待它的回调并在其中删除rowid 1,因为它的数量变为0,因此花费了

新删除qty = 5 - 3 = 2.由于它不是0,需要另外选择。

选择rowid 2

等待其回调并在其中更新rowid 2以设置qty = 38。

sqlite绑定中的序列化功能只会序列化两个Selects。在第一个Select和它的回调完成之前,无法知道第二个Select是否需要。只有这样,它才意识到第一个Select提供的数量不足。

如何使用纯JavaScript序列化第一个Select及其回调 - 没有JQuery或其他库。

这是一个伪代码示例: 这是我能想到的最简单的例子来演示这个问题。

假设db是sqlite数据库打开调用的结果,该调用成功。

var deletionQty = 5;

function selectCallBack(error, row) {
   // Assume no error.
   if (deletionQty >= row.qty) {
      // Delete row.rowNum
      deletionQty -= row.qty;   // Need to get the next table row to deduct remaining inventory from it.
   } else {
      // Update row.rowNum -> set qty = qty - deletionQty
      deletionQty = 0;          // Done!
   }
}

while (deletionQty > 0) {
   db.get("SELECT rowid AS rowNum, qty FROM Inventory ORDER BY date LIMIT 1", selectCallBack);
}

问题是while会连续执行,因为其范围内的任何内容都不会改变deletionQty的值。 只有回调修改它,因为这些是异步事件,while循环将执行,比如说之前100次 回调会更改deletionQty的值。如果存在1对1关系(同步关系),那么只有 执行一个db.get然后在下一个while循环周期之前执行它的回调,一切都会正常工作。 这是异步延迟回调,允许while执行连续设置新问题的回调。

1 个答案:

答案 0 :(得分:0)

我最近创建了一个名为WaitFor的简单抽象,以同步模式调用异步函数(基于Fibers):https://github.com/luciotato/waitfor

使用wait.for:

你的代码

...in a fiber...
var deletionQty = 5;
while (deletionQty > 0) {
   var data= wait.forMethod(db,'get',"SELECT rowid AS rowNum, qty FROM Inventory ORDER BY date LIMIT 1");
   if (deletionQty >= data.qty) {
      // Delete row.rowNum
      wait.forMethod(db,'delete', data.id);
      deletionQty -= data.qty;   // Need to get the next table row to deduct remaining inventory from it.
   } else {
      // Update row.rowNum -> set qty = qty - deletionQty
      wait.forMethod(db,'update'...
      deletionQty = 0;          // Done!
   }

}//loop

WiredPrairie的评论是最准确的。您无法在Node中关闭异步。这是Node的基础。你需要一个像wait.for这样的lib(基于node-fiber),或者'async'或promises(Q)来编写顺序逻辑。

DB顺序逻辑它不是为什么节点制作的。

也检查这个答案: Callback hell in nodejs?

除此之外,也许您需要一张表格:product_id,qyt_in_stock 并递增或递减此字段,而不是删除和插入行。