now uses promise then/catch pattern and always returns something meaningful.