Вопрос

Я пытаюсь построить простое веб-приложение, соскоб веб-сайта, используя nodejs и его 2 модулями запроса и cheerio.

Мне удается сделать это со следующим кодом:

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

        }
    } )());
};
.

Работает нормально, чтобы распечатать URL картинки на сайте, но что я действительно пытаюсь сделать здесь, состоит в том, чтобы создать список URL, который я мог бы использовать вне функции.Я попробовал это так, но он возвращает пустой список:

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

            }
        } )());
    };
.

Как я могу это исправить?Большое спасибо

Это было полезно?

Решение

Вам нужно подождать, пока все обратные вызовы не сделают.

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

        }
    })());
};
.

Это часть асинхронной природы Node.js.Если бы все сложнее, я бы порекомендовал вам использовать библиотеку управления потоком, такую как async .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top