Асинхронный вызов с извлечением, не дожидаясь завершения, и сразу отправляется к - PullRequest
2 голосов
/ 08 июля 2019

Я пытаюсь чередовать выполнение нескольких функций одна за другой.

Приведенный ниже код правильно вычисляет страницы, но ничего не возвращает вызывающей стороне.

const rp = require('request-promise');
const cheerio = require('cheerio');
const fetch = require('node-fetch');

async function getNumberOfPages(url) {

    const pageUrl = url + "1";
    rp(pageUrl)
    .then(function(html) {
        return fetch(pageUrl)
        .then(response => response.text())
        .then(html => {
            const entriesPerPage = 20;
            const $ = cheerio.load(html);
            let totalEntries = $(".Aa").first().text()
            let pagesNumber = Math.ceil(totalEntries / entriesPerPage);
            return pagesNumber;
            })
        })
}

На самом деле, вызывающий абонент сразу же входит в B), и журнал консоли выглядит так: «Number pages: undefined».

function loadAllFeedbacks(url) {

    getNumberOfPages(url)
    // A) Get first the pages number
    .then(result => {
        console.log("Number pages: " + result);
    })
    // B) Executes this next
    .then(() => {
        rp(url)

Я не могу понять, почему.Кажется, что я должен сделать что-то с извлечением, но не знаю как.

Также интересно, есть ли смысл использовать rp и fetch вместе, кажется, достаточно только одного.

Спасибо

1 Ответ

3 голосов
/ 08 июля 2019

getNumberOfPages доходит до конца, ничего не возвращая, поэтому возвращает обещание, которое разрешается как undefined.

Вам нужно явно что-то вернуть.

async function getNumberOfPages(url) {
    const pageUrl = url + "1";
    return rp(pageUrl)
    // etc

Однако теперь вы возвращаете обещание без использования await в любой момент. Поэтому использование ключевого слова async бессмысленно.

function getNumberOfPages(url) {
    const pageUrl = url + "1";
    return rp(pageUrl)
    // etc

Или вы можете переписать функцию, чтобы использовать await

async function getNumberOfPages(url) {
    const pageUrl = url + "1";
    const value_never_used = await rp(pageUrl);
    const response = await fetch(pageUrl);
    const html = await response.text();
    const entriesPerPage = 20;
    const $ = cheerio.load(html);
    let totalEntries = $(".Aa").first().text();
    let pagesNumber = Math.ceil(totalEntries / entriesPerPage);
    return pagesNumber;
}

Нет смысла использовать request-promise и node-fetch, следовательно value_never_used

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