Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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 node.js/sqlite-序列化回调以及主要函数_Javascript_Node.js_Serialization_Sqlite - Fatal编程技术网

Javascript node.js/sqlite-序列化回调以及主要函数

Javascript node.js/sqlite-序列化回调以及主要函数,javascript,node.js,serialization,sqlite,Javascript,Node.js,Serialization,Sqlite,例如: 包含2行的数据库表: rowid name qty date 1 milk 3 8/25 2 milk 40 8/30 需要首先使用最旧的牛奶执行减去5个牛奶项目的库存交易 e、 g 选择rowid1 等待其回调,并在其中删除行ID 1,因为其数量变为0,因此已消耗 新增删除数量=5-3=2。由于不是0,因此需要进行另一次选择 选择rowid2 等待其回调,并在其中更新rowid2以设置qty=38 sqlite绑定中的序列化功能将只序

例如:

包含2行的数据库表:

 rowid name qty date   
 1     milk   3 8/25    
 2     milk  40 8/30    
需要首先使用最旧的牛奶执行减去5个牛奶项目的库存交易

e、 g

选择rowid1 等待其回调,并在其中删除行ID 1,因为其数量变为0,因此已消耗

新增删除数量=5-3=2。由于不是0,因此需要进行另一次选择

选择rowid2

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

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

如何使用纯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循环将在 回调更改deletionQty的值。如果存在1对1关系(同步关系),那么 执行一个db.get,然后在下一个while循环周期之前执行它的回调,一切正常。
异步延迟回调允许while连续执行设置新回调,这就是问题所在。

我最近创建了一个名为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
WiredPairie的评论是最准确的。无法在节点中关闭异步。这是节点的基础。您需要一个类似wait.for(基于节点光纤)或“async”或promises(Q)的库来编写顺序逻辑

DB顺序逻辑它不是节点的用途

也请检查此答案:

除此之外,也许你还需要一张桌子,上面写着:product\u id,qyt\u in\u stock
并增加或减少此字段,而不是删除和插入行。

您需要编辑问题,以包含一些您正在努力解决的代码。不清楚你在问什么。我对代码没有问题。问题是如何关闭异步,以便在考虑/尝试下一次选择之前,将选择及其回调作为一个逻辑思想执行。将select放入循环会产生X个回调,select和它的回调之间没有同步。在我的示例中,第一个回调必须在第二个Select之前执行,我不知道如何控制它。这就是我要找的。对于节点中的大多数功能,不能关闭异步。这是节点的基础。如果您添加了代码(或其中的一部分),则更容易显示。听起来您只是想将第二个调用放在第一个的回调中。此外,我不知道你为什么不使用其他库。如果我理解正确的话,有很多方法可以使这个模式变得非常简单。我更新了这个问题,试图突出我所说的内容。为什么不在上一个删除完成后触发下一个删除?我不想在节点中关闭async。我想在绑定到sqlite时关闭异步。我不明白你的代码是如何解决这个问题的。我的回电在哪里?db.get需要一个回调,我想与db.get同步的就是这个回调。我希望db.get等待并在结果准备好后立即启动回调,当回调结束时,执行循环中的下一个db.get。db.get是一个异步函数。它将立即返回,并且仅当de data就绪时才会触发回调。Wait.for为db.get创建默认回调,然后等待回调调用,直到数据就绪。-wait.for允许您在同步模式下调用异步函数,因此您可以等待。等待选择的结果,然后决定删除或更新。我将研究这个“光纤”功能,看看是否要使用它。除非绝对必要,否则我不喜欢添加库,因为它们中的许多最终都会因疏忽而死亡,然后基于它们的代码就会出现问题。我认为这个问题实际上是node.js中的一个漏洞,应该通过让node想出一个方法来处理这个问题,或者通过祝福一个解决方案来支持它,这样它就有更好的机会不因疏忽而死亡,从而在某种程度上“正式”地填补这个漏洞。当我完成评估后,我将重新讨论这个问题。谢谢你提醒我,因为我以前从未听说过纤维。