HTML5 localStorage เป็นแบบอะซิงโครนัสหรือไม่


คำตอบ:


157

ไม่การlocalStorageโทรทั้งหมดเป็นแบบซิงโครนัส


5
แหล่งที่มาดั้งเดิมของฉันคือเอกสาร Mozilla localstorage แต่ดูเหมือนว่าจะได้รับการแก้ไขตั้งแต่นั้นมา (และข้อมูลจำเพาะ W3 ดูเหมือนจะไม่ต้องการการซิงค์ / async ที่ใดก็ได้) ณ จุดนี้ฉันจะบอกว่าการเรียก localstorage นั้นซิงโครนัสตามแบบแผน แต่ไม่ใช่ตามข้อกำหนด เว้นแต่คุณจะทราบเบราว์เซอร์ที่ใช้งานแบบ async
Ryan Nigro

36
ปัญหาของฉันคือฉันตั้งค่าโทเค็นการรับรองความถูกต้องในที่จัดเก็บในตัวเครื่องแล้วเปลี่ยนเส้นทางผู้ใช้ไปยังมุมมองอื่น บางครั้งในการเข้าถึงพื้นที่เก็บข้อมูลในมุมมองใหม่พบว่าโทเค็นยังไม่ได้รับการบันทึกดังนั้นฉันจึงต้องใช้การหมดเวลา แต่ก็ยังไม่น่าเชื่อถือ 100%
The Muffin Man

@TheMuffinMan: ปัญหาของคุณอาจเกี่ยวข้องกับnbfหรือexpจากโทเค็นการตรวจสอบสิทธิ์
Mendes

3
เหมือนกันสำหรับฉันสิ่งแปลก ๆ
patotoma

ฉันกำลังเผชิญปัญหาเดียวกัน ... มันเป็นพฤติกรรมแปลก ๆ
Daniel T. Sobrosa

62

แท้จริง พื้นที่เก็บข้อมูลบนเว็บไม่ได้เป็นส่วนหนึ่งของมาตรฐานหลักของ HTML5 อีกต่อไป แต่ถูกแยกออก

ข้อกำหนด (ร่าง) ที่เกี่ยวข้องสามารถพบได้ที่นี่และสิ่งหนึ่งที่คุณจะสังเกตเห็นก็คือมันไม่ได้กล่าวถึงซิงโครนัสหรืออะซิงโครนัสที่ใดก็ได้

อย่างไรก็ตามการวิเคราะห์ข้อความจะแนะนำว่าต้องซิงโครนัส (ตัวหนาของฉัน):

วิธีsetItem (คีย์ค่า)ต้องตรวจสอบก่อนว่าคู่คีย์ / ค่ากับคีย์ที่กำหนดมีอยู่แล้วในรายการที่เกี่ยวข้องกับออบเจ็กต์หรือไม่

หากไม่เป็นเช่นนั้นจะต้องเพิ่มคู่คีย์ / ค่าใหม่ในรายการด้วยคีย์ที่กำหนดและกำหนดค่าเป็นค่า

หากคีย์ที่กำหนดมีอยู่ในรายการและค่าของคีย์นั้นไม่เท่ากับค่าก็จะต้องมีการอัปเดตค่าเป็นค่า หากค่าก่อนหน้านี้เท่ากับค่าเมธอดจะต้องไม่ทำอะไรเลย

ในมาตรฐานคำพูดชอบmust, shallและmayดำเนินการมากความหมายเฉพาะ ความจริงที่ว่ามันกำลังพูดถึงสิ่งที่วิธีการต้องทำหมายความว่าวิธีการนั้นต้องทำไม่ใช่เลื่อนไปในภายหลัง

สิ่งนี้ยังขัดกับสามัญสำนึกอีกด้วย หากsetItemเป็นแบบอะซิงโครนัสคุณสามารถตั้งค่ารายการเป็นค่าเฉพาะจากนั้นเรียกคืนทันทีโดยรับค่าก่อนหน้า


มีเป็นบันทึกที่ด้านล่างของส่วนอินเตอร์เฟซการจัดเก็บข้อมูลที่มีคำแนะนำที่เป็นไปได้ของพฤติกรรมที่ไม่ตรงกันนี้:

ข้อกำหนดนี้ไม่จำเป็นต้องให้วิธีการข้างต้นรอจนกว่าข้อมูลจะถูกเขียนลงดิสก์จริง จำเป็นต้องมีความสอดคล้องในสิ่งที่สคริปต์ต่างๆที่เข้าถึงรายการคู่คีย์ / ค่าเดียวกันเท่านั้นที่จำเป็น

อย่างไรก็ตามนั่นเป็นเพียงในแง่ของสิ่งที่เขียนลงในพื้นที่เก็บข้อมูลระยะยาวเท่านั้น ประโยคสุดท้ายระบุว่าสคริปต์ที่เข้าถึงอ็อบเจ็กต์หน่วยเก็บข้อมูลเดียวกันจำเป็นเพื่อดูสิ่งต่างๆพร้อมกัน


2
ไม่จำเป็นต้องล้างสิ่งต่างๆลงในดิสก์ในครั้งเดียวดังนั้นหากคุณปิดแล้วเปิดหน้าอีกครั้งคุณอาจไม่มีองค์ประกอบล่าสุดที่คุณจัดเก็บไว้ ฉันได้ทดสอบแล้วในแอปไฮบริดใน Android และทำให้การใช้งาน localStorage ไม่เหมาะสมในบางกรณี
user276648

1
LocalStorageฉันต้องเก็บวัตถุบางอย่างที่ฉันต้องหน้าแตกต่างกันที่เหมาะสมที่สุดคือการใช้ เมื่อฉันเก็บ 10 รายการฉันพลาด 3 รายการ ฉันเชื่อจริงๆว่ามันเป็นแบบอะซิงโครนัส แต่จะตรวจสอบได้อย่างไรว่าเสร็จแล้ว ฉันต้องเพิ่มการโทรกลับที่ไหน
Adi Prasetyo

1
สะดุดกับเรื่องนี้และคิดว่านี้เป็นที่น่าสนใจเพื่อเพิ่มmust, shall, mayความคิดเห็นข้างต้น RFC2119 ietf.org/rfc/rfc2119.txt
mistertee

1
ฉันยังเห็นพฤติกรรมที่เหมือนอะซิงโครนัส เมื่อฉันบันทึกวัตถุว่างลงในรายการฉันสังเกตเห็นว่าเมื่อดึงข้อมูลของรายการทันทีหลังจากนั้นจะส่งคืนข้อมูลเก่าก่อนที่จะบันทึก ถ้าให้เดาคงเป็นแค่ความล่าช้าในการเขียนลงดิสก์
sookie

@sookie ระบบปฏิบัติการควรซ่อนปัญหาฮาร์ดแวร์เช่นนั้น แอปพลิเคชันอ่านจากบัฟเฟอร์แคชของระบบปฏิบัติการไม่ใช่จากดิสก์โดยตรง
Barmar

-6

คำถามนี้ได้รับคำตอบแล้ว สำหรับใครก็ตามที่จะมาถึงสิ่งนี้ในอนาคต javascript จะซิงโครนัสโดยธรรมชาติ สิ่งต่าง ๆ เป็นเพียง async ที่เราระบุให้ทำเช่นนั้น ด้วยเหตุนี้คุณจึงสามารถสมมติว่าทุกสิ่งเป็นแบบซิงโครนัสเว้นแต่จะระบุให้เป็น async นี่คือด้วยจาวาสคริปต์ไม่ใช่เฟรมเวิร์กที่เขียนด้วย Javascript บางครั้งพวกเขาทำลายการปฏิบัตินี้ เช่น NodeJs

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.