Javascript node.js/sqlite-序列化回调以及主要函数
例如: 包含2行的数据库表: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绑定中的序列化功能将只序
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想出一个方法来处理这个问题,或者通过祝福一个解决方案来支持它,这样它就有更好的机会不因疏忽而死亡,从而在某种程度上“正式”地填补这个漏洞。当我完成评估后,我将重新讨论这个问题。谢谢你提醒我,因为我以前从未听说过纤维。