2017-10-01 2 views
0

複数のファイルを並行してダウンロードし、そのURLをローカルストレージに保存されている辞書に保存します。コールバックは次のようになります。javascript/cordovaローカルストレージの競合状態を処理します(例:ファイルをダウンロードする

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がシングルスレッドであるため、競合状態が発生するとは予想していませんでした。しかし、彼らはプリントが示すように起こる。どうすればこれを防ぐことができますか?

答えて

1

このような方法でロックを使用する方法もあります。

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秒後に除去されない場合のように、いくつかのより多くの保護手段を追加したいです。

+0

私は似たようなものを考えました。私はまだ競争条件/マルチスレッド化がどこから来るのか正確に知りたい。 –

関連する問題