function OKCMS () { var cache = null this.getAll = function () { var deferred = $.Deferred() if (cache) { deferred.resolve(cache) } else { $.ajax({ method: 'GET', url: '/db.json', dataType: 'json' }).done(onFetch).fail(onError) } return deferred function onFetch (data) { cache = sort(data) // Freeze that mutha // if (Object.freeze) // deepFreeze(cache) deferred.resolve(data) } function onError (err) { deferred.reject(err) } // In-place sort by __index function sort (data) { Object.keys(data).forEach(function (key) { data[key] = (data[key] || []).sort(byIndex) }) return data } function byIndex (a, b) { var iA = a && a.__index var iB = b && b.__index return iA > iB ? -1 : (iB > iA ? 1 : 0) } } }