2014-09-01 4 views
0

Мне нужен механизм, который займет довольно небольшой фрагмент javascript, содержащий синхронные вызовы функций и перепишет его как асинхронный javascript.советы/предложения по анализу javascript

Так, например, если у меня есть фрагмент

someSyncFunction(); 
console.log("function complete") 

мне нужно переформатирования

someAsyncFunction(function() {console.log("function complete")}); 

Является ли это задача, которую я мог бы взять на себя с регулярным выражением, или я должен был бы написать парсер? Если последнее, любые предложения по любым библиотекам, которые помогут?

Просто усложнять немного, мне нужно иметь дело с рекурсией/вложенности, например ...

someSyncFunction(); 
console.log("first function complete"); 
someSyncFunction(); 
console.log("second function complete"); 
... 
+0

Сколько javascript вам нужно изменить? Я бы рекомендовал сделать это вручную, если это возможно, потому что я думаю, что синтаксический анализ/использование регулярных выражений, вероятно, будет сопряжен с осложнениями. – ne1410s

+0

фрагменты будут содержать до 10 строк или около того, а не включать определения функций. – pinoyyid

+0

Я предполагаю, что у вас разные функции синхронизации? и что каждый фрагмент отличается от остальных? Я немного динозавр, поэтому я, вероятно, буду использовать find-and-replace в достойном текстовом редакторе вместе с ручным утилизацией. – ne1410s

ответ

2

Да, вам нужно будет использовать анализатор. Regex на самом деле не способен анализировать произвольно вложенный код javascript. Вероятно, вы захотите использовать http://esprima.org/, который дает вам синтаксическое дерево, в котором вы можете найти свои асинхронные функции и соответствующим образом преобразовать дерево.

Однако, я не думаю, что вы захотите заново изобрести колесо. Посмотрите на это list of tools that compile synchronous to asynchronous JavaScript.

-1

Спасибо за предложения. Вот результаты ...

  • esprima, безусловно, сделать работу, и вот где я пойду дальше, если регулярное выражение попадает в буфер
  • Я смотрел на полезный список компиляторов на https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS#synchronous-to-asynchronous-javascript-compilers-cps, но все они добрался до большого количества багажа за то, чего я хочу достичь. Kal пришел ближе всего
  • Начиная с предложения @ Avinash, я обнаружил, что регулярное выражение делать то, что я хочу, замечательно просто, так что с этим я и поеду. Чтобы уточнить, регулярное выражение в http://regex101.com/r/dL0uQ2/1 будет обрабатывать один экземпляр sync-> async-преобразования, поэтому я буду называть его рекурсивно, пока выход не станет стабильным.
Смежные вопросы