Обещания могут помочь справиться с этим. Существует два основных сценария - параллельный и последовательный. Параллельно можно выполнить с помощью Promise.all (), последовательный - более сложный - задача B может начаться только после выполнения задачи A. Вот простой пример:
// returns a promise that resolves as the task is done
const wrap = (fn, delay) => new Promise(resolve => setTimeout(_ => resolve(fn()), delay));
const task = (fn, delay) => delay ? wrap(fn, delay) : Promise.resolve(fn());
// given a list of promises, execute them one by one.
const sequence = async l => l.reduce(async (a, b) => [].concat(await a, await b));
const tasks = [
task(_ => console.log("hello world")),
task(_ => console.log("hello future"), 1000)
];
sequence(tasks).then(_ => console.log("all done"));
Вам может потребоваться перевод ES6 / 7, чтобы это работало в браузерах или более старых версиях узлов.