Какова лучшая стратегия для удаления более чем одной страницы одновременно? - PullRequest
0 голосов
/ 29 ноября 2011

Я последовал примеру

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 Ответ

1 голос
/ 29 ноября 2011

Я предлагаю использовать 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 страниц одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...