Как сделать мою функцию синхронной с циклами в Node js - PullRequest
0 голосов
/ 05 января 2019

Я занимаюсь поиском в сети на каком-то сайте, используя модуль запроса. Я разделил свою работу на три функции здесь. Первая функция получает cookie для меня, во второй функции я получаю ссылки с основных страниц, которые мне нужно посетить, а в третьей функции я снова получаю ссылки на некоторые другие страницы с последних ссылок, которые я выбрал. Вот мой основной код:

 getCookie(function (header_to_set) {
    getLinksToVisit(header_to_set, function (CoursePageLinks) {
            console.log("Link to visit first: " + CoursePageLinks);
            getAssigmentPages(CoursePageLinks, header_to_set, function (assignment_link_page) {
                console.log("Link to the Assignment: " + assignment_link_page);
                /* Visiting Assignment Page to get the active assignments */


                    request({
                        url: assignment_link_page,
                        method: 'POST',
                        headers: header_to_set
                    }, function (errorGettingPage, assignmentPageResponse, assignmentPageHtml) {
                        console.log(assignmentPageResponse.headers);
                        res.send(assignmentPageHtml);
                    })


            });

    })

});

Теперь проблема в том, что когда я вызываю мою функцию getLinskToVisit (), она возвращает мне CoursePageLinks, но перед этим ее используют функции getAssignmentPages (). Я предполагаю, что это происходит, потому что мой getLinksToVisit () по-прежнему асинхронный из-за циклов в нем. Помогите мне сделать это синхронно, потому что я не смог этого сделать. Вот мой код getLinksToVisit ():

function getLinksToVisit(headers, callback) {
    let links_to_visit = [];
    console.log(headers);
    request({
        url: "http://someLink",
        headers: headers,
        followRedirect: false,
        method: 'GET',
    }, function (accessPage, getLinksResponse, getLinksHTML) {
        var attributes = [];
        const root = htmlparser.parse(getLinksHTML);
        const parsedData = root.querySelector('#selectNav').querySelectorAll('option');
        for (let i = 0; i < parsedData.length; i++) {
            attributes[i] = parsedData[i].rawAttributes;
        }
        let j = 0;
        for (let l = 0; l < attributes.length; l++) {
            if (attributes[l].value != '""') {
                links_to_visit.push(attributes[l].value);
                j++;
            }
        }
        callback(links_to_visit);
        //console.log(links_to_visit);
        //callback(links_to_visit);
    });
}

1 Ответ

0 голосов
/ 05 января 2019

Я думаю, вам лучше научиться работать с Async \ Await или Promises (которые в значительной степени совпадают). https://javascript.info/async-await - Async \ Await

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise - Обещания.

старые добрые способы обратного вызова довольно старые и делают вещи немного более грязными.

...