Javascript 如何在Node.js中实现递归承诺调用
我正在调用一个API,在这个API中,每个请求只能获取1000条记录, 我能够通过递归实现这一点 我现在正在尝试使用Promissions实现同样的目标,我对Node.js和JavaScript也相当陌生 我尝试在if-else块中添加递归代码,但失败了Javascript 如何在Node.js中实现递归承诺调用,javascript,node.js,recursion,promise,Javascript,Node.js,Recursion,Promise,我正在调用一个API,在这个API中,每个请求只能获取1000条记录, 我能够通过递归实现这一点 我现在正在尝试使用Promissions实现同样的目标,我对Node.js和JavaScript也相当陌生 我尝试在if-else块中添加递归代码,但失败了 var requestP = require('request-promise'); 我想使用promise以同步方式执行该方法, i、 e.我想等到所有记录都导出到一个文件,然后继续我的代码我认为最好创建自己的承诺,并在完成递归后简单地解
var requestP = require('request-promise');
我想使用promise以同步方式执行该方法,
i、 e.我想等到所有记录都导出到一个文件,然后继续我的代码我认为最好创建自己的承诺,并在完成递归后简单地解决它。这里有一个简单的示例,供您理解该方法 异步函数myRecursiveLogic(resolveMethod,ctr=0){ //这就是你的逻辑所在 等待新的承诺((res)=>setTimeout(res,1000));//等待-例如 ctr++; console.log('counter:',ctr); 如果(ctr==5){ resolveMethod();//完成工作,解决承诺 }否则{ 等待myRecursiveLogic(resolveMethod,ctr);//递归-继续工作 } } //使用单个承诺运行该方法
新承诺((res)=>myRecursiveLogic(res)),然后(r=>console.log('done')代码>我认为最好创建自己的承诺,并在完成递归后简单地解决它。这里有一个简单的示例,供您理解该方法 异步函数myRecursiveLogic(resolveMethod,ctr=0){ //这就是你的逻辑所在 等待新的承诺((res)=>setTimeout(res,1000));//等待-例如 ctr++; console.log('counter:',ctr); 如果(ctr==5){ resolveMethod();//完成工作,解决承诺 }否则{ 等待myRecursiveLogic(resolveMethod,ctr);//递归-继续工作 } } //使用单个承诺运行该方法
新承诺((res)=>myRecursiveLogic(res)),然后(r=>console.log('done')代码>这是一个使用最新NodeJS功能的干净而漂亮的解决方案。 递归函数将继续执行,直到满足特定条件(在本例中,异步获取一些数据) 递归函数可按如下方式使用:
const main = async () => {
const data = await recursive()
// do something here with the data
}
这是一个使用最新NodeJS特性的干净而漂亮的解决方案。 递归函数将继续执行,直到满足特定条件(在本例中,异步获取一些数据) 递归函数可按如下方式使用:
const main = async () => {
const data = await recursive()
// do something here with the data
}
使用您的代码,我对其进行了重构,如下所示。我希望有帮助
const requestP = require('request-promise');
const option = {
url: 'rest/api/2/search',
json: true,
qs: {
//jql: "project in (FLAGPS)",
}
};
/*
NOTE: Add async to the function so you can udse await inside the function
*/
const callback = async (body) => {
// some code
//saving records to file
//some code
try {
const result = await requestP(option, callback).auth('api-reader', token, true);
if (totlExtractedRecords < total) {
return callback(result);
}
return result;
} catch (error) {
console.log('Error Observed ' + err);
return error;
}
}
const requestP=require('request-promise');
常量选项={
url:'rest/api/2/search',
是的,
qs:{
//jql:“项目在(FLAGPS)”,
}
};
/*
注意:将async添加到函数中,这样您就可以在函数中等待udse了
*/
常量回调=异步(正文)=>{
//一些代码
//将记录保存到文件
//一些代码
试一试{
const result=await requestP(选项,回调).auth('api-reader',标记,true);
如果(totlExtractedRecords
使用您的代码,我对其进行了重构,如下所示。我希望有帮助
const requestP = require('request-promise');
const option = {
url: 'rest/api/2/search',
json: true,
qs: {
//jql: "project in (FLAGPS)",
}
};
/*
NOTE: Add async to the function so you can udse await inside the function
*/
const callback = async (body) => {
// some code
//saving records to file
//some code
try {
const result = await requestP(option, callback).auth('api-reader', token, true);
if (totlExtractedRecords < total) {
return callback(result);
}
return result;
} catch (error) {
console.log('Error Observed ' + err);
return error;
}
}
const requestP=require('request-promise');
常量选项={
url:'rest/api/2/search',
是的,
qs:{
//jql:“项目在(FLAGPS)”,
}
};
/*
注意:将async添加到函数中,这样您就可以在函数中等待udse了
*/
常量回调=异步(正文)=>{
//一些代码
//将记录保存到文件
//一些代码
试一试{
const result=await requestP(选项,回调).auth('api-reader',标记,true);
如果(totlExtractedRecords
使用Amir Popovich的反馈创建此代码
const rp=require('Request-Promise'))
常量fs=require('fs')
常量页面大小=200
常量选项={
网址:'https://jira.xyz.com/rest/api/2/search',
是的,
qs:{
jql:“项目中的项目(project_XYZ)”,
maxResults:pageSize,
startAt:0,
字段:“*全部”
},
认证:{
用户:“api读取器”,
通过:“”,
发信人:是的
}
}
const updateCSV=(elment)=>{
//fs.writeFileSync('issuedata.json',json.stringify(elment.body,未定义,4))
}
异步函数getPageinatedData(解析、拒绝、ctr=0){
var总计=0
等待rp(选项)。然后((正文)=>{
让a=身体问题
控制台日志(a)
a、 forEach(元素=>{
console.log(元素)
//updateCSV(元素)
});
total=body.total
}).catch((错误)=>{
拒绝(错误)
返回
})
点击率=点击率+页面大小
options.qs.startAt=ctr
如果(ctr>=总计){
解决();
}否则{
等待getPageinatedData(解决、拒绝、ctr);
}
}
新承诺((解决,拒绝)=>getPageinatedData(解决,拒绝))
.然后(()=>console.log('DONE'))
.catch((error)=>console.log('观察到的错误-'+error.name+'\n'+'错误代码-'+error.statusCode));
使用Amir Popovich的反馈创建此代码
const rp=require('Request-Promise'))
常量fs=require('fs')
常量页面大小=200
常量选项={
网址:'https://jira.xyz.com/rest/api/2/search',
是的,
qs:{
jql:“项目中的项目(project_XYZ)”,
maxResults:pageSize,
startAt:0,
字段:“*全部”
},
认证:{
用户:“api读取器”,
通过:“”,
发信人:是的
}
}
const updateCSV=(elment)=>{
//fs.writeFileSync('issuedata.json',json.stringify(elment.body,未定义,4))
}
异步函数getPageinatedData(解析、重解析)
const main = async () => {
const data = await recursive()
// do something here with the data
}
const requestP = require('request-promise');
const option = {
url: 'rest/api/2/search',
json: true,
qs: {
//jql: "project in (FLAGPS)",
}
};
/*
NOTE: Add async to the function so you can udse await inside the function
*/
const callback = async (body) => {
// some code
//saving records to file
//some code
try {
const result = await requestP(option, callback).auth('api-reader', token, true);
if (totlExtractedRecords < total) {
return callback(result);
}
return result;
} catch (error) {
console.log('Error Observed ' + err);
return error;
}
}
const rp = require('Request-Promise')
const fs = require('fs')
const pageSize = 200
const options = {
url: 'https://jira.xyz.com/rest/api/2/search',
json: true,
qs: {
jql: "project in (PROJECT_XYZ)",
maxResults: pageSize,
startAt: 0,
fields: '*all'
},
auth: {
user: 'api-reader',
pass: '<token>',
sendImmediately: true
}
}
const updateCSV = (elment) => {
//fs.writeFileSync('issuedata.json', JSON.stringify(elment.body, undefined, 4))
}
async function getPageinatedData(resolve, reject, ctr = 0) {
var total = 0
await rp(options).then((body) => {
let a = body.issues
console.log(a)
a.forEach(element => {
console.log(element)
//updateCSV(element)
});
total = body.total
}).catch((error) => {
reject(error)
return
})
ctr = ctr + pageSize
options.qs.startAt = ctr
if (ctr >= total) {
resolve();
} else {
await getPageinatedData(resolve, reject, ctr);
}
}
new Promise((resolve, reject) => getPageinatedData(resolve, reject))
.then(() => console.log('DONE'))
.catch((error) => console.log('Error observed - ' + error.name + '\n' + 'Error Code - ' + error.statusCode));