循环前功能未完成

时间:2015-01-02 03:50:08

标签: javascript mysql node.js asynchronous

我正在尝试将一个url数组传递给node.js中的这个函数,它似乎在实际传递给函数之前循环遍历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。如您所见,我每次都会在日期变量中添加一天,然后将带有修改日期的URL传递给loadPage函数。我正在努力让一切按顺序工作。似乎我的其余代码按顺序排列,但我不能让这个特定的代码传递URL,等待函数完成,然后传递第二个URL。我认为这是async.eachSeries函数的重点。

所以回顾一下,我想:

  1. 在第一个网址
  2. 上调用loadData函数
  3. 等待该功能完成
  4. 继续(添加日期和循环以再次运行loadPage函数)。
  5. 这是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);
            }
        });
    }
    

    提前致谢!

1 个答案:

答案 0 :(得分:0)

我认为request是一个异步函数。因此,此函数在单独的线程中运行。程序继续执行,无需等待请求完成,从而创建所描述的效果。尝试查找同步函数,或在Java中实现类似信号量的操作,以确保程序等待request完成。