Javascript 使用承诺的JS分页
我正在尝试使用承诺进行API调用。API是分页的,因此,根据第一个API调用中的头,如果需要,可以进行更多操作以获得其余结果 以下是我目前掌握的情况: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
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
};