HTML5 localStorage có phải là không đồng bộ không?


Câu trả lời:


157

Không, tất cả các localStoragecuộc gọi đều đồng bộ.


5
Nguồn ban đầu của tôi là tài liệu Mozilla localstorage, nhưng có vẻ như chúng đã được sửa đổi kể từ đó (và thông số W3 dường như không yêu cầu đồng bộ / không đồng bộ ở bất kỳ đâu). Tại thời điểm này, tôi muốn nói rằng các cuộc gọi lưu trữ cục bộ là đồng bộ theo quy ước nhưng không phải theo thông số kỹ thuật. Trừ khi bạn biết về một trình duyệt đã triển khai nó không đồng bộ?
Ryan Nigro

36
vấn đề của tôi là tôi đặt mã thông báo xác thực trong bộ nhớ cục bộ, sau đó chuyển hướng người dùng đến chế độ xem khác. Đôi khi trên chế độ xem mới truy cập bộ nhớ cục bộ thấy rằng mã thông báo chưa được lưu, vì vậy tôi phải sử dụng thời gian chờ, nhưng vẫn không đáng tin cậy 100%.
The Muffin Man,

@TheMuffinMan: Vấn đề của bạn có thể liên quan đến nbfhoặc exptừ mã xác thực.
Mendes

3
Tương tự đối với tôi, những thứ kỳ lạ
patotoma

Tôi đang đối mặt với cùng một vấn đề ... đó là một hành vi kỳ lạ.
Daniel T. Sobrosa

62

Thực ra. lưu trữ web không còn là một phần của tiêu chuẩn cốt lõi HTML5 nữa, nó đã bị tách ra.

Đặc tả kỹ thuật (bản nháp) có liên quan có thể được tìm thấy ở đây và một điều bạn sẽ nhận thấy là nó không đề cập đến đồng bộ hoặc không đồng bộ ở bất kỳ đâu.

Tuy nhiên, phân tích văn bản sẽ gợi ý rằng nó phải đồng bộ (chữ in đậm của tôi):

Phương thức setItem (khóa, giá trị) trước tiên phải kiểm tra xem một cặp khóa / giá trị với khóa đã cho đã tồn tại trong danh sách được liên kết với đối tượng hay chưa.

Nếu không, thì một cặp khóa / giá trị mới phải được thêm vào danh sách, với khóa đã cho và giá trị của nó được đặt thành giá trị.

Nếu khóa đã cho tồn tại trong danh sách và giá trị của nó không bằng giá trị, thì khóa đó phải được cập nhật giá trị thành giá trị. Nếu giá trị trước đó của nó bằng giá trị, thì phương thức không phải làm gì cả.

Trong các tiêu chuẩn, các từ như must, shallmaymang những ý nghĩa rất cụ thể. Thực tế là nó đang nói về những gì phương thức phải làm có nghĩa là bản thân phương thức đó phải làm điều đó, không phải trì hoãn nó đến một thời gian sau.

Điều này cũng ảnh hưởng đến ý thức chung. Nếu setItemkhông đồng bộ, có thể đặt một mục thành một giá trị cụ thể rồi ngay lập tức truy xuất nó, lấy giá trị trước đó của nó.


một lưu ý ở dưới cùng của phần giao diện lưu trữ mà gợi ý khả năng hành vi không đồng bộ:

Đặc điểm kỹ thuật này không yêu cầu các phương thức trên phải đợi cho đến khi dữ liệu được ghi vào đĩa một cách vật lý. Chỉ cần có sự nhất quán trong những tập lệnh khác nhau truy cập vào cùng một danh sách cơ bản của các cặp khóa / giá trị nhìn thấy.

Tuy nhiên, đó chỉ là về những gì được ghi vào bộ nhớ lâu dài. Câu cuối cùng yêu cầu các tập lệnh truy cập vào cùng một đối tượng lưu trữ được yêu cầu để xem mọi thứ một cách đồng bộ.


2
Thật vậy, mọi thứ không nhất thiết phải được chuyển vào đĩa ngay lập tức, vì vậy nếu bạn đóng rồi mở lại trang của mình, bạn có thể không có các phần tử mới nhất mà bạn đã lưu trữ. Tôi đã thử nghiệm điều đó trong một ứng dụng kết hợp trong Android và nó làm cho việc sử dụng localStorage trở nên không hợp lệ trong một số trường hợp.
user276648 23/04

1
tôi cần lưu trữ một số đối tượng mà tôi phải để trong trang khác, thích hợp nhất là sử dụng LocalStorage. Khi tôi lưu trữ 10 món đồ, tôi bỏ lỡ 3 món trong số đó. Tôi thực sự tin rằng nó không đồng bộ, nhưng làm thế nào để kiểm tra xem nó đã hoàn thành chưa. nơi tôi phải thêm cuộc gọi lại?
Adi Prasetyo

1
Vấp về vấn đề này và nghĩ rằng đây là thú vị để thêm vào must, shall, maybình luận trên RFC2119 ietf.org/rfc/rfc2119.txt
mistertee

1
Tôi cũng đang thấy hành vi giống như không đồng bộ. Khi tôi lưu một đối tượng trống vào một mục, tôi nhận thấy rằng khi truy xuất dữ liệu của mục đó ngay sau đó trả về dữ liệu cũ trước khi lưu. Nếu tôi đoán, có lẽ đó chỉ là sự chậm trễ của việc ghi vào đĩa
sookie

@sookie Hệ điều hành nên ẩn bất kỳ vấn đề phần cứng nào như vậy. Các ứng dụng đọc từ bộ đệm đệm của hệ điều hành, không phải trực tiếp từ đĩa.
Barmar

-6

Câu hỏi này đã được trả lời. Đối với bất kỳ ai đến với điều này trong tương lai, bản chất javascript là đồng bộ. Mọi thứ chỉ không đồng bộ mà chúng tôi được chỉ định để làm như vậy. Do đó, bạn có thể cho rằng tất cả mọi thứ đều đồng bộ trừ khi chúng được chỉ định là không đồng bộ. Đây là với javascript, không phải các khuôn khổ được viết bằng Javascript. Họ đôi khi phá vỡ thông lệ này. Giống như NodeJs.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.