This concerns me a little bit. If a user of this library needs to wait for initialize to resolve (they would), then they would need to call initialize again to gain access to a promise to wait on. This means that the database adapters would have to initialize twice.

This can be solved by either not calling initialize in the library, or altering the StickyStorageAdapter to memoize and return the same promise on a subsequent call, ensuring that initialize is only called once. One benefit to the latter approach is that library users can still use the library if they forget to call initialize. That could also be a downside, because if they don't initialize, then the bugs will only appear when doing things immediately on page load. This however can be worked around by calling initialize internally.

```coffeescript
class StickyStorageAdapter
  constructor: (name) ->
    @name = name || 'Backbone.dualStorage'

  initialize: _.memoize -> # only initialize once, and memoize the returned promise
    deferred = $.Deferred()
    @store = new StickyStore
      name: @name
      adapters: ['indexedDB', 'webSQL', 'localStorage']
      ready: -> deferred.resolve()
    return deferred.promise()

  setItem: (key, value) ->
    @initialize().then => # ensure initialize is resolved before executing
      deferred = $.Deferred()
      @store.set key, value, (storedValue) ->
        deferred.resolve storedValue
      return deferred.promise()

  ...
```