Pregunta

Estoy tratando de construir una aplicación web simple que raspa un sitio web usando NODEJS y su solicitud de 2 módulos y Cheerio.

Logro para hacerlo con el siguiente código:

    var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);

            $('img').each(function(){
                console.log($(this).attr('src'));
            });

        }
    } )());
};

Funciona bien para imprimir la URL de las imágenes en el sitio web, pero lo que realmente estoy tratando de hacer aquí es crear una lista de url que pueda usar fuera de la función.Lo probé de esta manera, pero devuelve una lista vacía:

var urlList=[];     
var printURL=function(url){
        request(url, (function() {
            return function(err, resp, body) {
                if (err)
                    throw err;
                $ = cheerio.load(body);

                $('img').each(function(){
                    urlList.push($(this).attr('src'));
                });

            }
        } )());
    };

¿Cómo puedo arreglar esto?Muchas gracias

¿Fue útil?

Solución

Debe esperar hasta que se realicen todas las devoluciones de llamada.

var urlList=[];     
var printURL=function(url){
    request(url, (function() {
        return function(err, resp, body) {
            if (err)
                throw err;
            $ = cheerio.load(body);
            var images = $('img');
            var counter = images.length;
            images.each(function(){
                urlList.push($(this).attr('src'));
                counter--;
                if (counter==0) {
                    // now we have all images!!
                    console.log(urlList);
                }
            });

        }
    })());
};

Esto es parte de la naturaleza asíncrona de Node.js.Si las cosas se complican más, le recomendaría que use una biblioteca de control de flujo como async .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top