首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node.js / sqlite -序列化回调和主函数

node.js / sqlite -序列化回调和主函数
EN

Stack Overflow用户
提问于 2013-09-01 03:53:42
回答 1查看 2.3K关注 0票数 0

示例:

包含2行的数据库表:

代码语言:javascript
复制
 rowid name qty date   
 1     milk   3 8/25    
 2     milk  40 8/30    

需要首先使用最旧的牛奶执行减去5个牛奶项目的库存事务。

例如:

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

新删除数量=5-3= 2。由于不为0,因此需要重新选择。

选择rowid 2

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

sqlite绑定中的序列化功能将只序列化这两个Selects。在第一个Select及其回调完成之前,根本无法知道是否需要第二个Select。直到那时,它才意识到第一次选择提供的数量不够。

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

这里有一个伪代码示例:这是我能想到的演示该问题的最小示例。

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

代码语言:javascript
复制
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的值。如果存在一对一的关系(同步关系),那么只执行一个db.get,然后在下一个while循环循环之前执行它的回调,那么一切都会正常工作。异步延迟回调允许while连续执行,设置新的回调才是问题所在。

EN

回答 1

Stack Overflow用户

发布于 2013-09-01 23:48:04

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

您使用wait.for编写的代码:

代码语言:javascript
复制
...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

维莱德·普莱里的评论是最准确的。您不能在Node中关闭异步。这是Node的基础。你需要像wait.for这样的库(基于节点纤维),或者'async‘或者promises (Q)来编写时序逻辑。

DB顺序逻辑,它不是构成节点的目的。

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

除此之外,您可能需要一个包含: product_id、qyt_in_stock和递增或递减该字段的表,而不是删除和插入行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18552205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档