在javascript/cordova本地存储中处理竞争条件,例如下载文件时

在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',

我想并行下载几个文件,并将它们的URL保存到本地存储中的字典中。回调看起来是这样的:

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秒后锁没有被卸下,因为其间出现了问题。

我想到了类似的方法。我仍然想知道竞赛条件/多线程性的确切来源。