Node JS动态集合ajax调用异步等待

时间:2016-01-23 20:09:52

标签: javascript jquery ajax node.js asynchronous

我正在尝试使用节点js构建Web剪贴板。我有一个数组,它将具有动态大小。该数组包含我需要访问的URL列表。我使用https://scotch.io/tutorials/scraping-the-web-with-node-js进行网页报废。我正在使用请求模块为节点js创建请求。我推荐了这个http://www.sebastianseilund.com/nodejs-async-in-practice,我猜async.forEach应该对我的场景很有用,但是我无法理解如何让API等到所有网页报废结果都没有获得。我是节点js的新手。对此的任何指导对我来说都非常有帮助。

好。我添加了某种代码,我尝试但不按我想要的方式工作。 我希望Async方法的所有输出在某个数组中连接为对象列表,并将其作为JSON发送给客户端。



var express = require('express');
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app     = express();
var async = require('async');
app.get('/scrape', function(req, res){
	
    //URL list will be dynamic.
	var urlList = ['1','2','3'];

//async for each
async.forEach(urlList,function(url,callback){
    
    
    request({url: url,
    headers:{
        'User-Agent': 'spider'
    }
    }, function(error, response, html){
        debugger;
		if(!error){
         debugger;
			var $ = cheerio.load(html);
            
            
			$('span').filter(function(){
                debugger;
		        var data = $(this);
				//console.log(data)
		        var someprocessedValue = data.attr('data');
		        //release = data.children().last().children().text();
                callback(someprocessedValue);
	        })
	       
		}
        
	});
    
    
    
    
},
function(err){
    if(err) console.log(err);
    res.send('Check your console!');
});

});




根据@Robrich的回答,我修改了代码并到达了它正在工作的地方。如果有人想在以后使用它,我发布代码以供参考。



app.get('/scrape', function(req, res)
{
var urlList=['http://a.com','http://b.com'];


async.map(urlList,scrapper,function(err,results){
    if(err){
        
    }
    else
    {
        res.send('Check your console!');
    }
});
}
var scrapper = function(url,cb){
var data = new Object();
data.url = url;
data.isError = false;
  request({url: url,
    headers:{
        'User-Agent': 'spider'
    }
    }, function(error, response, html){
        //debugger;
		if(!error){
         //debugger;
			var $ = cheerio.load(html);
    
            //some logic
			
	        return cb(null,data);
		}
        else{
            data.IsError=true;
         return cb(error,data);
        }
        
	});
}




我上面的代码可能会出现支撑问题。但我按照我想要的方式工作。 谢谢!

1 个答案:

答案 0 :(得分:1)

使用async.map代替async.forEach