2015-05-10 16 views
2
var prompt = ... 
var connection = ... 

prompt.start(); 

var property = { 
    name: 'yesno', 
    message: 'approve this screencast?', 
    validator: /y[es]*|n[o]?/, 
    warning: 'Must respond yes or no', 
    default: 'no' 
}; 

connection.queryAsync('SELECT * FROM screencasts WHERE approved = 0') 
    .spread(function(screencasts) { 
    screencasts.forEach(function(screencast) { 
     console.log('Title: "' + screencast.title + '".'); 
     prompt.get(property, function(err, res) { 
     console.log('Command-line input received:'); 
     console.log(' result: ' + res.yesno); 
     }); 
    }); 
    }); 

Цель: Перечисление screencast с и предложит пользователю одобрять или отклонять их в интерактивном режиме.Как обработать элемент, прежде чем переходить к следующему в a для каждого цикла?

Проблема: Я думаю, что проблема заключается в том, что цикл не блокирует вообще, что приводит к следующему элементу, обрабатывается слишком быстро:

enter image description here

Как я жду пользователя введите значение перед «обработкой» следующего элемента в последовательности?

+0

Я поставил вопрос как ['prompt'] (https://github.com/flatiron/prompt), но, чтобы быть однозначным, вот ссылка на конкретный модуль, который я использую: https: // github .com/flatiron/prompt –

ответ

0

Кто-то упомянул mapSeries, и что заставило меня думать о example, который показывает, как избежатьmapSeries и вместо этого использовать Блюберд-х map.

То, что я закончил с таким:

var promise = ... 
var prompt = ... 
var connection = ... 

promise.promisifyAll(prompt); 
... 

connection.queryAsync('SELECT * FROM screencasts WHERE approved = 0') 
    .spread(function(screencasts) { 
    var current = promise.resolve(); 
    promise.map(screencasts, function(screencast) { 
     current = current.then(function() { 
     console.log('Title: "' + screencast.title + '".'); 
     return prompt.getAsync(property); 
     }).then(function(res) { 
     console.log(res); 
     }); 
     return current; 
    }); 
    }); 

кажется, работает хорошо. Мне любопытно. Является ли map наиболее подходящей функцией для этого?

+0

Нет, использование 'Promise.map' здесь неуместно. Вы могли бы использовать оригинальный 'screencasts.forEach' с этим подходом. Вместо этого вы должны использовать 'Promise.reduce', так что вы можете не записывать эту' current = current.then (...) 'вещь. – Bergi

+0

Не могли бы вы показать мне, как, Берги? Спасибо за ваш комментарий, приятель. –

Смежные вопросы