use PromiseValue as most return type