When a store does not need to sync but sync is called anyway, the success and failure callbacks are never called (because there is nothing to sync).
So if you use the success and failure callbacks to resolve or reject a promise, as you would naturally do, in case there is nothing to sync, the promise is never fulfilled or rejected!

I think the sync() method should have one more callback type, one that is called in case there is no sync needed. Then using Ext.Deferred and Promises will work as intended.

I found a workaround using store.isSyncing, if it is absent then no need to call sync() and you can then resolve or reject your promise.