HTML5 localStorageは非同期ですか?


回答:


158

いいえ、すべてのlocalStorage呼び出しは同期しています。


5
私の元のソースはMozilla localstorage docsでしたが、それ以降は改訂されているようです(W3仕様ではどこにも同期/非同期を必要としないようです)。この時点で、localstorageの呼び出しは、仕様ではなく、慣例により同期していると思います。非同期で実装されているブラウザに気付いていない限り、
Ryan Nigro 2017年

34
私の問題は、ローカルストレージに認証トークンを設定してから、ユーザーを別のビューにリダイレクトすることです。新しいビューにアクセスすると、ローカルストレージにアクセスすると、トークンがまだ保存されていない場合があるため、タイムアウトを使用する必要がありますが、100%の信頼性はありません。
マフィンマン

@TheMuffinMan:あなたの問題はおそらく認証トークンに関連するnbfexp、認証トークンからのものです。
Mendes、

3
私にも同じ、奇妙なもの
パトトーマ

私は同じ問題に直面しています...それは奇妙な行動です。
Daniel T. Sobrosa

62

実は。WebストレージはHTML5コア標準の一部ではなくなり、分割されました。

関連する(ドラフト)仕様はここにあり、同期または非同期については言及されていないことに気づくでしょう。

しかし、テキストの分析は、それが同期的である必要があることを示唆します(私の太字):

SetItem関数(キー、値)メソッドは、指定されたキーを持つキー/値ペアが既にオブジェクトに関連付けられたリストに存在する場合は、最初のチェックしなければなりません。

そうでない場合は、指定されたキーとその値をvalueに設定して、新しいキー/値のペアをリストに追加する必要があります。

指定されたキーがリストに存在し、その値がvalueと等しくない場合は、その値をvalueに更新する必要があります。以前の値がvalueと等しい場合、メソッドは何も実行してはなりません。

標準では、言葉が好きでmustshallかつmay持ち運びに非常に特定の意味を。メソッドが何をしなければならないかについて話しているという事実は、メソッド自体がそれをやらなければならないことを意味します。

これも常識に従います。setItem非同期の場合、アイテムを特定の値に設定してすぐに取得し、以前の値を取得することができます。


そこの非同期動作の可能性を示唆ストレージインタフェース部の下部にあるノートは:

この仕様では、上記のメソッドがデータが物理的にディスクに書き込まれるまで待機する必要はありません。キー/値ペアの同じ基本的なリストにアクセスする異なるスクリプトが見るものの一貫性のみが必要です。

ただし、それは長期ストレージに書き込まれる内容の点でのみです。最後の文は、同期的に物事を見るには、同じストレージオブジェクトにアクセスするスクリプトが必要であることを要求しています。


2
実際、必ずしもすべてが一度にディスクにフラッシュされるわけではないため、ページを閉じてから再度開くと、最新の要素が保存されていない可能性があります。私はそれをAndroidのハイブリッドアプリでテストしましたが、localStorageの使用が不適切になる場合があります。
user276648

1
オブジェクトを別のページに保存する必要がありますLocalStorage。最も適切なのは使用です。10個のアイテムを保存すると、そのうち3個が見つかりません。私はそれが非同期だと本当に信じていますが、それが行われたかどうかを確認する方法。どこにコールバックを追加する必要がありますか?
Adi Prasetyo 2017年

1
この上でつまずい、これはに追加する面白いと思ったmustshallmayRFC2119上記のコメントはietf.org/rfc/rfc2119.txt
mistertee

1
非同期のような動作も見ています。空のオブジェクトをアイテムに保存すると、アイテムのデータをすぐに取得すると、保存前の古いデータが返されます。私が推測するとすれば、それはおそらくディスクへの書き込みの遅延にすぎません
sookie

@sookieオペレーティングシステムは、そのようなハードウェアの問題を非表示にする必要があります。アプリケーションは、ディスクから直接ではなく、オペレーティングシステムのバッファキャッシュから読み取ります。
Barmar

-6

この質問はすでに回答されています。将来これに取り組む人は誰でも、JavaScriptは本質的に同期しています。物事は非同期であり、そうするように指定されています。このため、非同期であると指定されていない限り、すべてのものは同期していると想定できます。これはJavaScriptであり、JavaScriptで記述されたフレームワークではありません。彼らは時々この習慣を破ります。NodeJのように。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.