improve promise design