promises - guarantee options.success/error are called first