Добрый день!
Для текстового редактора делаю рекурсивный обход DOM (записываю в массив parrents и sibling).
Ниже тестовый пример. 
В функции nextsibling  рекурсивно делаю проход по nextsibling элементам и когда их уже нет,то возвращаю количество символов.
Для получения асинхронного значения из функции  nextsibling я создал новое событие, которое уже потом вызывается.
Работать с событиями в данной ситуации мне удобнее, чем через Promise.
Вопрос. Правильно ли ли так делать - использовать события  для получения асинхронного значения, которые вызываются только принудительно
function testy(){
        var finallength; 
        function nextsibling(node){
           if(node){
                if (node.nodeType==1){
                    elems.rightsibling.push({node:node.nodeName,length:node.TextContent.length})
                    rightlength+=node.textContent.length;     
                }
                 else{
                     rightlength+=node.textContent.length;//длина siblings
                 }
                nextsibling(node.nextSibling)
            }else{  //когда элементов нет
                finallength=rightlength; //global var - длина символов
             var eventforsibling = new CustomEvent('eventforsibling');//новое событие
                document.body.dispatchEvent(eventforsibling) //вызов
            } 
        }
        
    function parentnodes(node,stopnode){
      // Listen for the event.
            document.body.addEventListener('eventforsibling', function () {      alert( finallength) });
        }
        parentnodes(node,stopnode);
}