JS Нумерация страниц с использованием обещаний - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь сделать вызов API, используя обещания. API разбит на страницы и поэтому, в зависимости от заголовков в этом первом вызове API, делает больше, чтобы получить остальные результаты, если это необходимо.

Вот что у меня так далеко:

const get = (url, pageNo) => {
    var options = {
        url: url,
        headers: {
            'Authorization': `Token token=${apiToken}`
        },
        json: true,
        page: pageNo
    };

    return new Promise((resolve, reject) => {
        request.get(options, (err, resp) => {
            err ? reject(err) : resolve(resp);
        })
    });
};

Использование get() для l oop и получение всех ответов:

const getAll = (plannerId, timestamp, range) => {
    const plannerBookingsUrl = new URL(
        `/api/planners/${plannerId}/bookings?since=${timestamp}&range=${range}`,
        baseUrl
    );

    let response = get(plannerBookingsUrl, 1);
    let bookings = [];
    bookings.push(response);

    response.then(results => {
        let moreRequests = true;
        let currentPage = 1;
        const totalPages = parseInt(results.headers['x-total-pages']);

        while (moreRequests) {
            if (currentPage < totalPages) {
                nextBatch = get(plannerBookingsUrl, currentPage + 1);
                bookings.push(nextBatch);
                currentPage++;
            } else {
                moreRequests = false;
            }
        }
    });

    return Promise.all(bookings);
};

Main(), где я использую getAll(...):

const main = () => {
    const response = getAll(
        '11716',
        '2020-02-27',
        '7'
    );

    response.then(results => {
        console.log(results);
    .catch(error => console.log(error))
};

main();

Возвращает начальный обещание, но не остальные обещания.

У меня действительно проблема с чтением первого API, созданием остатка и возвратом их всех вместе для использования в моей основной функции.

Любая помощь будет высоко ценится!

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Вы можете поместить все свои логи извлечения c в while l oop. То, как вы получаете ваши заказы, остается тем же, за исключением первого раза, когда вам нужно получить немного больше информации о количестве страниц.

Выполните sh, сделав вашу функцию async и проверьте первый раз l oop, если значение totalPages уже известно. Если это не так, await ответ и получение информации из заголовков, а в противном случае просто pu sh ответ на массив bookings.

const getAll = async (plannerId, timestamp, range) => {

    const plannerBookingsUrl = new URL(
        `/api/planners/${plannerId}/bookings?since=${timestamp}&range=${range}`,
        baseUrl
    );

    let bookings = [];
    let currentPage = 1;
    let totalPages = null;

    while (totalPages === null || currentPage < totalPages) {
        let response = get(plannerBookingsUrl, currentPage);
        if (totalPages === null) {
            let results = await response;
            totalPages = parseInt(results.headers['x-total-pages']);
        }
        bookings.push(response);
        currentPage++;
    }

    return Promise.all(bookings);

};
0 голосов
/ 10 марта 2020

Проблема в том, что вы возвращаете Promise.all(bookings) за пределами response.then обратного вызова, поэтому на данный момент bookings содержит только первый вызов get(plannerBookingsUrl, 1).

Вот возможное решение с использованием async :

const getAll = async (plannerId, timestamp, range) => {
    const plannerBookingsUrl = new URL(
        `/api/planners/${plannerId}/bookings?since=${timestamp}&range=${range}`,
        baseUrl
    );

    let response = get(plannerBookingsUrl, 1);
    let bookings = [];
    bookings.push(response);

    const results = await response; // wait for results here

    let moreRequests = true;
    let currentPage = 1;
    const totalPages = parseInt(results.headers['x-total-pages']);

    while (moreRequests) {
        if (currentPage < totalPages) {
            nextBatch = get(plannerBookingsUrl, currentPage + 1);
            bookings.push(nextBatch);
            currentPage++;
        } else {
            moreRequests = false;
        }
    }

    return Promise.all(bookings); // bookings now contains every next batch
};

Адаптируется на main() Функция:

const main = async () => {
    const results = await getAll(
        '11716',
        '2020-02-27',
        '7'
    );

    ...
};

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