在javascript/cordova本地存储中处理竞争条件,例如下载文件时
我想并行下载几个文件,并将它们的URL保存到本地存储中的字典中。回调看起来是这样的:在javascript/cordova本地存储中处理竞争条件,例如下载文件时,javascript,cordova,Javascript,Cordova,我想并行下载几个文件,并将它们的URL保存到本地存储中的字典中。回调看起来是这样的: function(entry) { var downloads = JSON.parse(global.storage.getItem('downloads')); downloads[dbid] = entry.toURL(); console.log(downloads); global.storage.setItem('downloads',
function(entry) {
var downloads = JSON.parse(global.storage.getItem('downloads'));
downloads[dbid] = entry.toURL();
console.log(downloads);
global.storage.setItem('downloads', JSON.stringify(downloads));
}
我没想到会出现争用情况,因为js是单线程的。但它们确实发生在指纹上。如何防止这种情况发生?一种方法是使用锁,类似这样的东西
function addDownloadUrl(entry) {
var lock = global.storage.getItem('downloads_lock')
if (lock) {
setTimeout(function(){ addDownloadUrl(entry) }, 500);
} else {
global.storage.setItem('downloads_lock', '1');
var downloads = JSON.parse(global.storage.getItem('downloads'));
downloads[dbid] = entry.toURL();
console.log(downloads);
global.storage.setItem('downloads', JSON.stringify(downloads));
global.storage.removeItem('downloads_lock');
}
}
我还没有测试过它,您可能还想添加一些保护措施,例如,如果在X秒后锁没有被卸下,因为其间出现了问题。我想到了类似的方法。我仍然想知道竞赛条件/多线程性的确切来源。