Apakah HTML5 localStorage asynchronous?

129

Apakah setItem(key,value)fungsinya asynchronous?

localStorage.setItem("key",someText);
jas7
sumber
1
Saya tidak berpikir demikian. Downvoter: apa alasan Anda?
Waleed Khan

Jawaban:

157

Tidak, semua localStoragepanggilan sinkron.

Ryan Nigro
sumber
5
Sumber asli saya adalah dokumen penyimpanan lokal Mozilla, tetapi sepertinya dokumen tersebut telah direvisi sejak saat itu (dan spesifikasi W3 tampaknya tidak memerlukan sinkronisasi / asinkron di mana pun). Pada titik ini, saya akan mengatakan panggilan penyimpanan lokal disinkronkan dengan konvensi tetapi tidak dengan spesifikasi. Kecuali Anda mengetahui browser yang menerapkannya secara asinkron?
Ryan Nigro
36
masalah saya adalah saya menetapkan token autentikasi di penyimpanan lokal, dan kemudian mengarahkan pengguna ke tampilan lain. Kadang-kadang pada akses tampilan baru penyimpanan lokal menemukan bahwa token belum disimpan, jadi saya harus menggunakan batas waktu, tetapi masih belum 100% dapat diandalkan.
The Muffin Man
@TheMuffinMan: Masalah Anda mungkin terkait dengan nbfatau expdari token autentikasi.
Mendes
3
Sama untuk saya, hal
patotoma
Saya menghadapi masalah yang sama ... ini adalah perilaku yang aneh.
Daniel T. Sobrosa
62

Sebenarnya. penyimpanan web tidak lagi menjadi bagian dari standar inti HTML5, itu telah dipisahkan.

Spesifikasi (draf) yang relevan dapat ditemukan di sini dan satu hal yang akan Anda perhatikan adalah bahwa spesifikasi tersebut tidak menyebutkan sinkron atau asinkron di mana pun.

Namun, analisis teks akan menyarankan bahwa itu harus sinkron (tebal saya):

Metode setItem (key, value) harus terlebih dahulu memeriksa apakah pasangan kunci / nilai dengan kunci yang diberikan sudah ada dalam daftar yang terkait dengan objek tersebut.

Jika tidak, pasangan kunci / nilai baru harus ditambahkan ke daftar, dengan kunci yang diberikan dan nilainya disetel ke nilai.

Jika kunci yang diberikan memang ada dalam daftar, dan nilainya tidak sama dengan nilai, maka nilainya harus diperbarui menjadi nilai. Jika nilai sebelumnya sama dengan nilai, maka metode tersebut tidak boleh melakukan apa pun.

Dalam standar, kata-kata seperti must, shalldan maymembawa sangat makna khusus. Fakta bahwa itu berbicara tentang apa yang harus dilakukan metode berarti bahwa metode itu sendiri harus melakukannya, bukan menundanya di lain waktu.

Ini juga bertentangan dengan akal sehat. Jika setItemasinkron, dimungkinkan untuk menyetel item ke nilai tertentu lalu segera mengambilnya, mendapatkan nilai sebelumnya.


Ada adalah catatan di bagian bawah bagian antarmuka penyimpanan yang mengisyaratkan kemungkinan perilaku asynchronous:

Spesifikasi ini tidak mengharuskan metode di atas menunggu hingga data secara fisik ditulis ke disk. Hanya diperlukan konsistensi dalam skrip berbeda yang mengakses daftar dasar yang sama dari pasangan kunci / nilai yang dilihat.

Namun, itu hanya dalam hal apa yang ditulis ke penyimpanan jangka panjang. Kalimat terakhir mengamanatkan bahwa skrip yang mengakses objek penyimpanan yang sama diperlukan untuk melihat sesuatu secara sinkron.

paxdiablo
sumber
2
Sesungguhnya hal-hal belum tentu di-flush ke disk sekaligus, jadi jika Anda menutup kemudian membuka kembali halaman Anda, Anda mungkin tidak memiliki elemen terbaru yang Anda simpan. Saya telah mengujinya dalam aplikasi hybrid di Android, dan itu membuat penggunaan localStorage tidak sesuai dalam beberapa kasus.
pengguna276648
1
Saya perlu menyimpan beberapa objek yang harus saya simpan di halaman yang berbeda, yang paling sesuai adalah penggunaan LocalStorage. Ketika saya menyimpan 10 item, saya kehilangan 3 item. Saya benar-benar percaya itu asinkron, tetapi bagaimana cara memeriksa apakah itu dilakukan. di mana saya harus menambahkan panggilan balik?
Adi Prasetyo
1
Tersandung ini dan berpikir ini adalah menarik untuk menambah must, shall, maykomentar di atas RFC2119 ietf.org/rfc/rfc2119.txt
mistertee
1
Saya juga melihat perilaku seperti asynchronous. Saat saya menyimpan objek kosong ke sebuah item, saya perhatikan bahwa ketika mengambil data item segera setelah itu mengembalikan data lama sebelum disimpan. Jika saya menebak, itu mungkin hanya penundaan penulisan ke disk
sookie
@sookie Sistem operasi harus menyembunyikan masalah perangkat keras seperti itu. Aplikasi membaca dari cache penyangga sistem operasi, bukan langsung dari disk.
Barmar
-6

Pertanyaan ini sudah terjawab Bagi siapa pun yang datang ke hal ini di masa depan, javascript pada dasarnya sinkron. Hal-hal hanya asinkron, kita ditentukan untuk melakukannya. Karenanya, Anda dapat menganggap semua hal sinkron kecuali semuanya ditentukan sebagai asinkron. Ini dengan javascript, bukan kerangka kerja yang ditulis dalam Javascript. Mereka terkadang melanggar praktik ini. Seperti NodeJs.

Scott
sumber