Добрый день.
Разбираюсь в ноде по ходу реализации своего учебного проекта. Делаю консольную утилиту.
Есть слово и урл к которому это слово подставляется.
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 не позволяет.