just return the promise() instead of the deferred obj - avoid manipulation outside