我正在调用bitbucket API以获取存储库中的所有文件。我已经到达了一个点,我可以获取存储库中所有文件夹的列表,并并行地对存储库中的所有根文件夹进行第一个API调用,并获取所有文件夹的前1000个文件的列表。
但是问题是bitbucket api一次只能给我每个文件夹1000个文件。
我需要附加查询参数&start = nextPageStart并再次进行调用,直到它为null且每个API的isLastPage为true。如何使用下面的代码实现这一目标?
我从第一次调用api获得nextPageStart。请参阅下面的API响应。
下面是我到目前为止的代码。
感谢任何帮助或指导。
来自每个文件夹调用的单个API的响应。
{
"values": [
"/src/js/abc.js",
"/src/js/efg.js",
"/src/js/ffg.js",
...
],
"size": 1000,
"isLastPage": false,
"start": 0,
"limit": 1000,
"nextPageStart": 1000
}
我进行异步调用以获取文件列表的功能
export function getFilesList() {
const foldersURL: any[] = [];
getFoldersFromRepo().then((response) => {
const values = response.values;
values.forEach((value: any) => {
//creating API URL for each folder in the repo
const URL = 'https://bitbucket.abc.com/stash/rest/api/latest/projects/'
+ value.project.key + '/repos/' + value.slug + '/files?limit=1000';
foldersURL.push(URL);
});
return foldersURL;
}).then((res) => {
// console.log('Calling all the URLS in parallel');
async.map(res, (link, callback) => {
const options = {
url: link,
auth: {
password: 'password',
username: 'username',
},
};
request(options, (error, response, body) => {
// TODO: How do I make the get call again so that i can paginate and append the response to the body till the last page.
callback(error, body);
});
}, (err, results) => {
console.log('In err, results function');
if (err) {
return console.log(err);
}
//Consolidated results after all API calls.
console.log('results', results);
});
})
.catch((error) => error);
}
答案 0 :(得分:6)
我能够通过使用回调创建函数来使其工作。
cors
答案 1 :(得分:1)
我认为最好的方法是将其包装在一个古老的循环中(forEach不能与异步一起使用,因为它是同步的,并且会导致同时发出所有请求)。
我了解的是,您要进行某种引导查询,在该查询中您将获得values
数组,然后应该在页面之间进行迭代。这里有一些代码,我没有完全掌握API,所以我给出一个简化的(希望是可读的)答案,您应该能够适应它:
export async function getFilesList() {
logger.info(`Fetching all the available values ...`);
await getFoldersFromRepo().then( async values => {
logger.info("... Folders values fetched.");
for (let i = 0; ; i++ ) {
logger.info( `Working on page ${i}`);
try {
// if you are using TypeScript, the result is not the promise but the succeeded value already
const pageResult: PageResult = await yourPagePromise(i);
if (pageResult.isLastPage) {
break;
}
} catch(err) {
console.err(`Error on page ${i}`, err);
break;
}
}
logger.info("Done.");
});
logger.info(`All finished!`);
}
背后的逻辑是,首先getFoldersFromRepo()
返回一个保证金,该保证金返回值,然后我依次通过yourPagePromise
函数在所有可用页面上进行迭代(返回一个保证金)。 async / await构造允许编写更具可读性的代码,而不是使用then()的瀑布。
我不确定它是否遵守您的API规范,但这是您可以用作基础的逻辑! ^^