more promises, less chaining