код после функции начинает выполнятся еще до окончания кода в onBefore
Если у вас в onBefore асинхронщина, то почему вы ожидаете завершения onBefore перед выполнением $element.remove();
// Вариант с callback-функцией
function onBefore(completed) {
setTimeout(completed, 1000);
}
function onAfter(completed) {
setTimeout(completed, 2000);
}
// ...
onBefore(function() {
remove(id);
$element.remove();
onAfter(function() {
renderItems();
});
});
Но это, конечно, грязь. Используйте промисы:
var resolveImmediately =Promise.resolve.bind(Promise);
// ...
(onBefore || resolveImmediately)()
.then(function() {
remove(id);
$element.remove();
})
.then(onAfter || resolveImmediately)
.then(function() {
renderItems();
});