javascript - 函数在循环之前未完成

标签 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. 在第一个 URL 上调用 loadData 函数
  2. 等待该函数完成
  3. 继续(添加日期并循环再次运行 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);
        }
    });
}

提前致谢!

最佳答案

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

关于javascript - 函数在循环之前未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27737161/

相关文章:

javascript - 将图像/视频上传到单独的服务器 - Javascript Meteor

mysql - 创建包含日期列的 MySQL 表

node.js - NodeJS 集群调度策略

javascript - chrome延长生命周期,后台任务

javascript - Material UI 图标的类型

javascript - jQuery - 获取 Alt 文本并添加到警报

mysql - SQL数据库: #1242 - Subquery returns more than 1 row

php - 如何通过连接从两个表中获取数据

node.js - promise 阻止 Node 进程退出

node.js - 如何增加启动时的内存?