【发布时间】:2015-02-28 11:45:29
【问题描述】:
我试图在 node.js 中将一个 url 数组传递给这个函数,它似乎在将它们实际传递给函数之前循环遍历这些 URL。下面是调用函数的代码:
async.eachSeries(validDatesArr,
function(validDatesArrItem, callback){
var newMonth = validDatesArrItem.getMonth()+1;
loadPage(baseURL+'/month='+newMonth+'&day='+validDatesArrItem.getDate()+'&year='+validDatesArrItem.getFullYear(),function(data){
loopThroughData(data, function(){
var d = validDatesArr[count];
d.setDate(d.getDate() + 1);
validDatesArr.push(d);
count++;
callback();
});
});
}, function(err){
if(!err){
console.log('We processed each date requests one by one');
}
}
);
我正在使用的函数是 loadPage。如您所见,我每次都在 date 变量中添加一天,然后将带有修改日期的 URL 传递给 loadPage 函数。我正在努力让一切按顺序工作。似乎我的其余代码正在按顺序进行,但我无法让这个特定的代码传递 URL,等待函数完成,然后传递第二个 URL。我认为这就是 async.eachSeries 函数的意义所在。
所以回顾一下,我想:
- 在第一个 URL 上调用 loadData 函数
- 等待该函数完成
- 继续(添加日期并循环以再次运行 loadPage 函数)。
这里是loadPage函数代码:
function loadPage (url, callback){
data = [];
request(url, function(err, response, body){
if(!err && response.statusCode ==200){
console.log('Loading URL: ',url,' into Cheerio.');
var $ = cheerio.load(body);
$('td', 'tbody').each(function(){
var text = $(this).text();
data.push(text);
});
callback(data);
}
});
}
提前致谢!
【问题讨论】:
-
请看一下javascript Promises。
asynclibrary 是一个非常古老且丑陋的解决方案。了解 Promise 概念后,您将使用 Promise queue 快速解决您的问题。
标签: javascript mysql node.js asynchronous