Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.10.2014, 22:40
Интересующийся
Отправить личное сообщение для eniacty Посмотреть профиль Найти все сообщения от eniacty
 
Регистрация: 06.08.2014
Сообщений: 21

nodejs - цикл, консоль и асинхронность
Добрый день.

Разбираюсь в ноде по ходу реализации своего учебного проекта. Делаю консольную утилиту.

Есть слово и урл к которому это слово подставляется.

var word = 'fasq'; 
var url = 'http://translator.com/en-ru/?q=' + word;


Есть функция, которая проверяет слово на корректность - запрашивает страницу, парсит ее и если на странице есть div#spellcheck, то слово не корректно. Иначе все хорошо и кладем слово в массив correctWordList.

function isCorrectWord(word) {
  request({ uri:url, method:'GET', encoding: 'utf-8' },
      function (err, res, page) {
        var $ = cheerio.load(page);
        if ( $('div#spellcheck').html() ) {
          setNewWord($, word);
        } else {
          correctWordList.push(word);
        }
     });
}


Если не корректно. Передаем слово и страницу функции setNewWord.
На странице есть список слов, из которых можно выбрать корректный вариант (в ul#spellcheck li).
Записываем его в массив 'variants', выводим на экран и предлагаем выбрать корректный вариант (по индексу). Если жмем 'q' - выходим из процесса, если 's' слово просто пропускается, если что-то другое (цифры совпадающие с индексами элементов variants[]) - то берем слова из variants и кладем в массив correctWordList.

function setNewWord($, word) {
   console.log( "There's no tranlation for << " +word +" >>" );
   console.log('Choose correct one or press "r" to delete << ' +word +' >> from the list');
   $('ul#spellcheck li').each(function(i, elem) {
        variants.push($(this).text());
        console.log(i +'-' +variants[i]);
   });

  process.stdin.on('readable', function (key) {
        var key = process.stdin.read();
        if (!process.stdin.isRaw) {
          process.stdin.setRawMode( true );
        } else {
          var c = String(key);
          if (c == 'q') {
            process.exit(0);
          };
          if (c == 's') {
            console.log(word +' was skipped');
            
          } else {
            correctWordList.push(variants[c]);
            console.log(variants[c] +' was added');
          };
        };


Все хорошо, все работает.

Вопрос - как сделать так, чтобы это работало для массива слов?
var wordlist = ['hello', 'fasq', 'good'];


Если делать через цикл:

for (i = 0; i<wordlist.lenth;i++) {
   isCorrectWord(wordlist[i]);
};


то, конечно, цикл пробегает до того как приходит ответ и до того как пользователь может сделать выбор в консоли.

пробовал делать рекурсию с увеличением индекса внутри функции, но process.stdin.on не позволяет.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WebSocket - nodejs SVARAI AJAX и COMET 2 17.02.2014 08:41
Как подчинить себе цикл wreder jQuery 16 20.11.2013 22:17
Цикл завешивает страницу, помогите Romingood jQuery 5 19.10.2013 14:30
Бесконечный цикл Sundro Общие вопросы Javascript 8 08.08.2011 13:58
Comet: NodeJS - с чего начать разработку? Vulkan AJAX и COMET 13 27.11.2010 19:25