Events как альтернатива Promise
Добрый день!
Для текстового редактора делаю рекурсивный обход 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); } |
А при чем тут промисы?
Ты реализовал что-то типа паттерна Observer с нативным сахарком. У тебя просто body слушает событие. Механизмы то там в любом случае схожие чем то, внутри движка коллбеки, записанные в промисы дергаются на события, но у них назначение другое -- писать асинхронный код последовательно. В твоем случае где гарантия последовательного выполнения кода? Вызываешь ты свой testy, допустим, через рандомные промежутки времени трижды, и должна быть какая-то последовательность, чтобы они друг друга не перекрывали во времени, где у тебя это? В таком случае, нужно будет вручную синхронизировать это все в коллбеке eventforsibling, очередь создавать и тп. |
Да и вообще, у тебя фигня какая то. Код твой синхронен. Ты бы мог вместо этого
var eventforsibling = new CustomEvent('eventforsibling');//новое событие document.body.dispatchEvent(eventforsibling) //вызов просто вызывать alert( finallength), и было бы то же самое. Ты написал синхронный код через асинхронную жопу. Смысл то какой в этом? |
Часовой пояс GMT +3, время: 12:19. |