use promise library instead of complete, fail callbacks