Nodejs запрос asyn c проблема для l oop не работает - PullRequest
0 голосов
/ 16 января 2020

Я новичок nodejs, asyn c беспокоит меня. Я хочу, чтобы мой код выполнялся последовательно, иначе он сломается.
У меня есть for l oop, и он просто не работает ...
Вот все коды:

const util = require('util');
const request = require('request');
const cheerio = require('cheerio');

var host = "http://www.nicotv.me";
var url = "http://www.nicotv.me/video/play/57838-1-%s.html";
var len = 99;
var tab = /-(\d)-/.exec(url);
tab = tab[1] // '1' not '-1-'

function getLen(url) {
//you can ignore this function, it gives len=2
    request(url, function (err, response, html) {
        if (err) {
            console.log('url:', url);
            console.log('error:', err);
            console.log('statusCode:', response && response.statusCode);
        }
        else{
            var $ = cheerio.load(html);
            var cls = '.ff-playurl-dropdown-%s';
            $(util.format(cls, tab)).filter(function (){
                var data = $(this);
                len = data.html().match(/<a href=/g).length;
                console.log("episode:", len);
            });
            getLink(len, function(){

            });
        }
    });
}

getLen(util.format(url, 1)); //len = 2

var getLink = function(lengths, callback){
    for (let i = 1; i <= lengths; i++) {
        var tmp = util.format(url, i);
        try {
            request(tmp, function (err, res, html){
                console.log('url:', tmp);
                if(err){    
                    console.log("error:", err);
                    console.log("statusCode:", res && res.statusCode);
                }else{
                    var reg = /src="(\/player.php?.{1,})"/;
                    var result = reg.exec(html);
                    console.log(result[1]);
                }
            });
            callback();
        } catch (error) {
            console.log(error);
            break;
        }
    }
}

Вот мой вывод:

episode: 2
url: http://www.nicotv.me/video/play/57838-1-2.html
/player.php?u=aHR0cDovL3R5angyLmtpbmdzbnVnLmNuLzM2MHl1bi0xNS5waHA/dmlkPTE1NzkxMzU2MzEyNDAwNTQ5&p=360biaofan&c=0&j=aHR0cDovL2ppZXhpLmtpbmdzbnVnLmNuLzM2MGJpYW9mYW4ucGhwP3VybD0=&x=10&y=&z=
url: http://www.nicotv.me/video/play/57838-1-2.html
/player.php?u=aHR0cDovL3R5angyLmtpbmdzbnVnLmNuLzM2MHl1bi0xNS5waHA/dmlkPTE1Nzg1MDQyMDYyNDAwNTgx&p=360biaofan&c=0&j=aHR0cDovL2ppZXhpLmtpbmdzbnVnLmNuLzM2MGJpYW9mYW4ucGhwP3VybD0=&x=10&y=&z=aHR0cDovL3R5angyLmtpbmdzbnVnLmNuLzM2MHl1bi0xNS5waHA/dmlkPTE1NzkxMzU2MzEyNDAwNTQ5

Первая проблема состоит в том, что эти две /player*** ссылки относятся к 57838-1-1.html
И одна из них не завершена.
Вторая проблема заключается в том, что вывод URL показывает 57838-1-2.html дважды.

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 17 января 2020

Вчера была та же проблема, поэтому я решил с помощью:

  1. Использование запроса-обещания
  2. Заменить l oop метод arrTitles. Каждый на для (const jt arrTitles)

Вот пример:

    const request = require('request-promise');
    const cheerio = require('cheerio');

    var getUrlData =
        async function (url) {
            console.log(url);
            try {
                return await request.get(url);
            }
            catch (err) {
                console.error(`${err}: ${url}`);
            }
            return;
        };

    var run =
        async function (pageUrl) {

            var arrData =
                await fn.getUrlData(pageUrl)
                    .then(response => readTable(response));

            console.log(arrData);

        };

    var readTable =
        function (document) {

            var $;
            let arrData = [];

            try {
                $ = cheerio.load(document);

                $('table tr')
                    .each(
                        function (trN) {

                            $(this)
                                .children('td')
                                .each(
                                    function (tdN) {

                                        arrData.push($(this).text().trim());

                                    }
                                )
                        });
            }
            catch { }

            return arrData;
        };

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