Доброго времени суток.
Начал писать парсер html, столкнулся с проблемой ожидания promise'ов.
Использую
vow.
Есть некий код:
var promises = [], arr = [];
var parseUrl = function (i, url) {
promises[i] = vow.defer();
request({uri:url,method:'GET',encoding:'binary'},
function (err, res, body) {
var $=cheerio.load(
iconv.encode(
iconv.decode(
new Buffer(body,'binary'),
'win1251'),
'utf8')
);
arr[i] = $(some_selector).text();
console.log(arr[i]);
return promises[i].resolve();
});
}
var someFunc = (function () {
var urls = {0:'some_url'};
for(i in urls) {
parseUrl(i, urls[i]);
}
vow.all(promises).spread(function () {
for(i in urls) {
console.log(arr[i]);
}
});
})();
Собственно проблема в том, vow.all не ждёт ответа, а выводит "undefined", а потом выводится console.log с нужной информацией из функции parseUrl.
Если promises объявить как переменную, то проблема решается, но ссылок будет неопределенное кол-во, и соответственно такой вариант мне не подходит.
В документации описано только:
var defer1 = vow.defer(),
defer2 = vow.defer();
vow.all([defer1.promise(), defer2.promise(), 3])
.then(function(value) {
// value is "[1, 2, 3]" here
});
defer1.resolve(1);
defer2.resolve(2);
что мне не подходит из-за неопределенного кол-ва promise'ов.
Есть ли решение данной проблемы, или стоит присмотреться к другим promise модулям (Q/When)?
ps: io.js поставил 4 часа назад, заранее извиняюсь за возможно очевидные косяки =)