Не очень хорошая идея делать его асинхронным по умолчанию. Проверьте MobX для шаблона синхронного наблюдателя. С MobX легко пакетировать любую реакцию синхронного изменения на requestanimationFrame или на process.nextTick. Наличие синхронных обратных вызовов значительно упрощает отладку, поскольку код, запускающий изменение, находится в стеке вызовов.