const obj = [ { time: 1000, foo: () => console.log(1) }, { time: 500, foo: () => { console.log(2) } } ] obj.reduce(async (p, { foo, time }) => { await p return new Promise(res => setTimeout(() => (foo(), res()), time)) }, Promise.resolve())