0

私のバックボーン アプリケーションでは、オブジェクトをローカル ストレージに保存しており、保存後にのみ取得したいと考えています。

コールバック関数 (データを保存する関数の後に起動) を使用してみましたが、観察した遅延が少しあり、undefined が返されます。

ただし、関数呼び出し (データを取得する) を setTimeout を使用して 200 ミリ秒遅らせると、問題なく動作します。

それを行うエレガントな方法はありますか?

function delayed(){
    // this callback function retrieves the data
    callback.call(self);
}

window.setTimeout(delayed, 200);
4

3 に答える 3

0

最初は storage-event を使用することを考えましたが、この質問この質問、およびhtml5demos.com でのこのデモからわかるように、ストレージ イベントの使用は、ウィンドウ/タブのローカル ストレージの変更を追跡することを目的としています。 、ドキュメント自体の内部ではありません。

setItemただし、 setItem をオーバーライドすることで、 が呼び出されたときに発生する独自のイベントを作成できます。

//create an "onstoragechange" custom event
var storageEvent = document.createEvent('Event');
storageEvent.initEvent('onstoragechanged', true, true);

document.addEventListener('onstoragechanged', function (e) {
    alert('value added to localstorage');
    //or 
    alert(localStorage.getItem('test'));
    //call the code here, as you above would do after setTimeout
    //"callback.call(self);" or whatever 
}, false);

//override localStorage.setItem
var oldSetItem = Storage.prototype.setItem;
Storage.prototype.setItem = function() { 
    oldSetItem.apply(this, arguments);
    document.dispatchEvent(storageEvent);
}

//test
localStorage.setItem('test', 'value');

デモ/jsfiddle : http://jsfiddle.net/cYLHT/

これで、localStorage に何かを保存するたびにディスパッチされるイベントができ、書き込まれた値が実際に存在します。特定の重要なキーが更新/保存された場合の特別なイベントなど、アプリケーションを支援するイベントでこれを拡張します。上記はおそらく「トピック外」の回答、またはやり過ぎのようですが、コードの周りに setTimeouts を広めるよりもはるかに優れたアプローチだと思います。

于 2013-09-28T14:07:22.523 に答える
0

メモリ内の localStorage の外に複製を保持できます。localStorage のタイミングに依存する必要はありません。localStorage に頻繁に書き込み、ページの読み込み時にのみ読み込みます。

ただのアイデア!より詳細な情報がなければ、より具体的な答えを出すことは困難です。

于 2013-09-28T00:56:39.373 に答える