JavaScript Web SQL回调插入(如果不存在)
JavaScript Web SQL callbacks insert if not exists
我使用这个插入函数在for循环中向数据库中插入资源。我首先进行查询,以检查数据库中是否已经存在类似的资源。如果是这样,我们就不需要重新创建它。
for(var i = 0; i < 20; i++){
!function(i){
addResource("url", "type", ...)
}(i) // for local variable with callback
}
function addResource(url, type, callback){
getResource({"url":url}, function(tx, result){
console.log(result.rows.length, result.rows.length===1);
if(result.rows.length===0){ //didn't exist yet -> create it && return id
insertResource(url, type, function(tx, r){
callback(r.insertId);
});
} else if(result.rows.length===1){ //already exist -> return id
callback(result.rows.item(0).id);
} else { //should not happen -> error
console.error("addResource: Non unique identifier");
}
});
}
function insertResource(url, type, callback){
var query = "INSERT INTO resource(url, type) VALUES (?, ?);";
insert(query, [url, type], callback);
}
然而,当我运行此代码时,相同的资源会被添加20次,而不是仅添加一次。我怀疑回调执行的延迟使得所有"===0"检查都在创建之前通过。那么,有没有办法阻止这种情况的发生呢?当我对数据库施加约束时,当违反约束时,代码就会停止运行,这是我不希望发生的。
我怀疑回调执行的延迟使得所有"===0"检查都在创建之前通过。
是的。通过将同步for
循环与异步getResource()
和insert()
混合,在每一轮之间都有一个竞争条件。
循环并行开始所有20轮,在实际插入之前,所有轮都在同一时间寻找重复。他们都发现自己的结果集是空的,所以他们各自插入。
您可能想要使用异步迭代器,例如async
的timesSeries()
,因此每一轮都会延迟到完成之前。
async.timesSeries(20, function (i, done) {
addResource("url", "type", function (id) {
// ...
done(null);
});
});
相关文章:
- javascript如果图像不存在don't加载它
- 如果助手不在,如何从Grunt中的代码中调用任务
- 如果类不是一个选项,如何在使用 jQuery 时控制(避免)嵌套 html 元素的样式
- JavaScript-如果以前不存在文本,如何从文本区域删除新行
- Javascript变量到PHP变量-如果语句不起作用,则发布
- 如果状态不匹配,则缩小为丑陋
- 组合2个数组,如果它们不重复,则用0填充
- 如果语句不起作用,请单击
- 如果变量不是't已传递给函数.这是正确的方式吗
- 如果文件不存在,fs.watch是否有错误处理程序
- 如果用户不关闭弹出窗口'没有提供任何回应
- 如果下载不成功,如何显示消息
- jQuery 隐藏按钮,如果它们不包含文本
- 如果项目不匹配,则显示变量
- 如果语句不起作用 - JavaScript
- 如果我不应该在组件WillUpdate中调用setState,如何更新状态(使用ReactJS)
- 如何javascript验证<输入类型=文件多个>如果浏览器不支持多个
- 如果找不到路由,则以程序方式导航到服务器页面
- 如果statusCode不是200,那么从http调用返回什么类型的错误对象
- 使用javascript中的if和else语句来显示图像(如果图像不存在,则显示其他图像)