2011-11-28 45 views
0

我跟着例子同时取消多个页面的最佳策略是什么?

http://net.tutsplus.com/tutorials/javascript-ajax/how-to-scrape-web-pages-with-node-js-and-jquery/comment-page-1/

和它的工作非常出色。

但在我的情况下,当用户提交表单时,我需要取消多个页面。

我的代码看起来像

app.get('/lookup', function (req, res) { 

var pagesToScrap = []; 
var callbackCounter = 0; 
var items = []; 

var callback = function(){ 
    if(pagesToScrap == callbackCounter){ 
     res.render('list', { 
      title: "Hello World", 
      items: items 
     }); 
    } 
    callbackCounter++; 
} 

var pageAResolver = function() { 
    request.get({ 
      uri: 'http://a.com', 
      //... 
     items.push[jsonData]; 
     callback(); 
    ); 
} 
var pageBResolver = function() { 
    request.get({ 
      uri: 'http://b.com', 
      //... 
     items.push[jsonData]; 
     callback(); 
    ); 
} 
var pageCResolver = function() { 
    request.get({ 
      uri: 'http://c.com', 
      //... 
     items.push[jsonData]; 
     callback(); 
    ); 
} 
pagesToScrap[0] = {url: "http://a.com", resolver: pageAResolver} 
pagesToScrap[1] = {url: "http://b.com", resolver: pageBResolver} 
pagesToScrap[2] = {url: "http://c.com", resolver: pageCResolver} 

for(var i = 0; i < pagesToScrap.length; i++){ 
    pagesToScrap[i].resolver(); 
} 
}); 

当所有请求返回我发送给浏览器的响应。有时可能需要很长时间。没有缓存的最佳策略是更快地显示这些数据?

我在想socket.io,也许我可以同时发送数据?伙计们,你怎么看待它?

干杯, 巴勃罗·坎特罗

回答

1

我建议使用https://github.com/caolan/async,一个伟大的异步工作流库。

var async = require('async'); 

var pagesToScrape = [ 
    { url: "http://a.com" }, 
    { url: "http://b.com" }, 
    { url: "http://c.com" } 
]; 

// `async.map` will fire off all requests simultaneously 
// and collect the results for you: 

async.map(pagesToScrape, function(opts, callback) { 

    request.get(opts, function(res) { 
    // Do whatever analysis you need to get data from the page 
    var jsonData = getJsonDataFrom(res); 

    // Call callback when you've successfully scraped each page 
    // The first parameter to callback is for "errors" (null if no error) 
    // The second parameter is the jsonData object you want to use later. 
    callback(null, jsonData); 
    }); 
}, function done(err, items) { 
    // This function gets called when all the pages are finished 
    // items contains the list of jsonData returned to callback 
    console.log(items.length); // -> 3 

    var jsonData0 = items[0]; 
    console.log(jsonData0); // -> "{\"somedata":"fromthepage"... 
}); 

如果你刮了大量的页面,forEachLimit可能会更好 - 异步处理页面的整个列表,而只是等待一次N个页面。

+0

我按照我说的例子使用https://github.com/mikeal/request。请求模块也是异步的,对我来说,最重要的是创建一个push/comet/long这个数据池。我想单独发送回复这些数据,当我收到一个答案时,我想将其发送给答复。 –

相关问题