Javascript 如何在Node.js中实现递归承诺调用

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.我想等到所有记录都导出到一个文件,然后继续我的代码我认为最好创建自己的承诺,并在完成递归后简单地解

我正在调用一个API,在这个API中,每个请求只能获取1000条记录, 我能够通过递归实现这一点

我现在正在尝试使用Promissions实现同样的目标,我对Node.js和JavaScript也相当陌生

我尝试在if-else块中添加递归代码,但失败了

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));