Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用承诺的JS分页_Javascript_Node.js_Promise - Fatal编程技术网

Javascript 使用承诺的JS分页

Javascript 使用承诺的JS分页,javascript,node.js,promise,Javascript,Node.js,Promise,我正在尝试使用承诺进行API调用。API是分页的,因此,根据第一个API调用中的头,如果需要,可以进行更多操作以获得其余结果 以下是我目前掌握的情况: const get = (url, pageNo) => { var options = { url: url, headers: { 'Authorization': `Token token=${apiToken}` }, json: tru

我正在尝试使用承诺进行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()
循环并获取所有响应:

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);
};
这将返回初始承诺,但不返回剩余承诺

我真正遇到的问题是读取第一个API,生成剩余的API并将它们一起返回到主函数中使用

任何帮助都将不胜感激


谢谢。

问题是您返回的是
Promise.all(bookings)
外部
响应。然后
回调,因此此时
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
};

您可以将所有抓取逻辑放入
while
循环中。您获得预订的方式是相同的,除了第一次需要获得更多关于页数的信息

通过使函数
async
来实现这一点,如果
totalPages
值已知,则检查循环的第一次。如果不是这样,
等待
响应并从标题中获取信息,否则只需将响应推送到
预订
数组

const getAll=async(计划ID、时间戳、范围)=>{
const plannerBookingsUrl=新URL(
`/api/planners/${plannerId}/bookings?自=${timestamp}&range=${range}`,
基本URL
);
让预订量=[];
设currentPage=1;
让totalPages=null;
while(totalPages==null | | currentPage
您使用的是什么API?
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
};