ngStorage 的 $sync() 有什么作用?

What does ngStorage's $sync() do?

ngStorage 是 AngularJS 的浏览器 localStorage 和 sessionStorage 对象的包装器。

除了重新公开 get/set 方法外,它还提供了一个 $sync() 方法。但是localStorage和sessionStorage的读写已经是同步的了,那么$sync方法是做什么的呢?

正如documentation

中所说

changes will be automatically sync'd between $scope.$storage, $localStorage, and localStorage - even across different browser tabs!

正如所见here,显式 $sync 调用更新 $storage 以与 local/session 存储同步,如果不是出于某种原因。通常它不应该被手动调用,这就是它没有被记录的原因。

来自https://github.com/gsklee/ngStorage/blob/master/ngStorage.js

 $sync: function () {
                        for (var i = 0, l = webStorage.length, k; i < l; i++) {
                            // #8, #10: `webStorage.key(i)` may be an empty string (or throw an exception in IE9 if `webStorage` is empty)
                            (k = webStorage.key(i)) && storageKeyPrefix === k.slice(0, prefixLength) && ($storage[k.slice(prefixLength)] = deserializer(webStorage.getItem(k)));
                        }
                    }

据我了解,它将数据从内部 $storage 对象写入真实浏览器 webStorage 对象并用作私有函数

angular 服务接受对象,但浏览器存储只接受字符串。所以它基本上使用一个带有 gettor/settor 的代理对象来根据需要调用 JSON.stringify() 或 JSON.parse() 。

手动调用 $sync() 和 $apply() 可以作为安全检查。由于存储跨浏览器选项卡,因此存在潜在的多线程问题。在用户发生更改和 angular 摘要自动调用 $sync 之间有 window 的时间,其中来自一个浏览器选项卡的数据更改可以消除来自另一个试图更改的选项卡的更改同一个对象在同一时间。

但这似乎是 only-happens-in-QA-who-is-looking-for-it 类问题之一。