【问题标题】:Function Not Completeing Before Loop循环前函数未完成
【发布时间】: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 函数的意义所在。

所以回顾一下,我想:

  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);
        }
    });
}

提前致谢!

【问题讨论】:

  • 请看一下javascript Promises。 async library 是一个非常古老且丑陋的解决方案。了解 Promise 概念后,您将使用 Promise queue 快速解决您的问题。

标签: javascript mysql node.js asynchronous


【解决方案1】:

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

【讨论】:

  • 也许我理解错了,但是node.js中的所有功能不都是异步的吗?我的印象是我需要添加某种计数器或回调才能使其工作。
  • 根据我的测试,代码的$('td', 'tbody').each(function(){ 部分似乎是我需要确保在继续之前完成的部分。
  • @fullOfQuestions 是的。但据我所知,回调并没有使其同步。回调类似于try { return } catch {} 语句。它返回错误或结果。但要使其同步,回调是不够的。
  • "因此,这个函数在一个单独的线程中运行" - Node.js 的用户代码中没有没有线程
猜你喜欢
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2020-11-27
  • 2020-08-03
相关资源
最近更新 更多