简体   繁体   English

Javascript-Axios在for循环中。 在下一次获取数据的迭代中使用当前获取的响应

[英]Javascript - Axios in for loop. Using the response of current fetch for the next iteration of fetching data

I use the the variable previous_epoch to fetch reddit posts before today in the first iteration. 我使用变量previous_epoch在今天的第一次迭代中获取reddit帖子。 The next iteration previous_epoch must contain the date from the response data. 下一次迭代previous_epoch必须包含响应数据中的日期。 Oddly enough, the date doesn't change after the first two loops 奇怪的是,前两个循环后日期没有改变

const getposts = async(user) => {
    var dataArray = [];
    var utc = new Date()
      .toJSON()
      .slice(0, 10)
      .replace(/-/g, "/");

var previous_epoch;


  for(let i=0; i <=5; i++) {
    if(i == 0) {
        console.log('i is 0');
        previous_epoch = new Date(utc).getTime() / 1000;
        console.log('p',previous_epoch); <--keeps doesn't work after second loop
    } 
    else {
        // console.log('else',dataArray);
        previous_epoch = dataArray[dataArray.length-1].created_utc
        console.log('else',previous_epoch);
    }
    await getdat(user,previous_epoch).then((resp) => {
        let jsondat = resp.data.data;
                dataArray = jsondat.concat(dataArray);
    })
  }
  // console.log( dataArray);
  var result = _.map( dataArray, function( o ) {
      return o.id;
  });
/* console.log("%j",result); */
}

Function getdat() 函数getdat()

const getdat = (user,epoch) => {

    const sub_url = `https://api.pushshift.io/reddit/search/submission/?subreddit=${user}&limit=300&sort=desc&before=${epoch}`;
    console.log('elZK',sub_url);
  return new Promise((resolve, reject) => {
    axios.get(sub_url)
    .then(response => {
      return resolve(response)
    })
    .catch(error => {
      return reject(error.message)
    })
  })
}

here is the fiddle 这是小提琴

EDIT 2 : I've changed the logic so that I get the next date from getdat function itself 编辑2 :我更改了逻辑,以便从getdat函数本身获取下一个日期

const getdat = (user,epoch) => {
    let res= {};
    const sub_url = `https://api.pushshift.io/reddit/search/submission/?subreddit=${user}&limit=300&sort=desc&before=${epoch}`;
    console.log('elZK',sub_url);
  return new Promise((resolve, reject) => {
    axios.get(sub_url)
    .then(response => {
        let d = response.data.data;
        let e = d[d.length - 1].created_utc;
        console.log('e',e);
        res.data = d;
        res.epoch = e;
      return resolve(res)
    })
    .catch(error => {
      return reject(error.message)
    })
  })
}



export const getUserPosts = async(user) => {
    var dataArray = [];
    var utc = new Date()
      .toJSON()
      .slice(0, 10)
      .replace(/-/g, "/");

var previous_epoch;
var epoch;

for(let i=0; i <=5; i++) {
    if(dataArray.length === 0) {
        console.log('i is 0');
        previous_epoch = new Date(utc).getTime() / 1000;
        console.log('p',previous_epoch);
    } 
    else {
        // console.log('else',dataArray);
        previous_epoch = epoch;
        console.log('else',previous_epoch);
    }
    const resp = await getdat(user,previous_epoch);
    const jsondat = resp.data;
    dataArray = jsondat.concat(dataArray);  
    epoch = resp.epoch;      
  }
  // console.log( dataArray);
  var result = _.map( dataArray, function( o ) {
      return o.id;
  });
console.log("%j",result);
}

On first iteration you fetch posts before today, so last post in result will have created_utc before or equal today. 在第一次迭代中,您获取今天之前的帖子,因此结果中的最后一个帖子将在今天之前或之前具有created_utc。 Next iterations just repeat you first request. 接下来的迭代仅重复您的第一个请求。

Try this code 试试这个代码

for(let i=0; i <=5; i++) {
    if(dataArray.length === 0) {
        console.log('i is 0');
        previous_epoch = new Date(utc).getTime() / 1000;
        console.log('p',previous_epoch);
    } 
    else {
        // console.log('else',dataArray);
        previous_epoch = dataArray[0].created_utc
        console.log('else',previous_epoch);
    }
    const resp = await getdat(user,previous_epoch);
    const jsondat = resp.data.data;
    dataArray = jsondat.concat(dataArray);        
  }

Try this code 试试这个代码

const getdat = (user,epoch) => {    
    const sub_url = `https://api.pushshift.io/reddit/search/submission/?subreddit=${user}&limit=10&sort=desc&before=${epoch}`;
    console.log('elZK',sub_url);
    return axios.get(sub_url);
};

const getposts = async(user) => {
    let dataArray = []; 
    let previous_epoch;

    for(let i=0; i <=5; i++) {
     previous_epoch = dataArray.length>0 ? dataArray[dataArray.length-1].created_utc-1 : Math.floor(Date.now()/1000);
      const result =  await getdat(user,previous_epoch);  
      dataArray = dataArray.concat(result.data.data);
    }

    console.log(dataArray.map(e => e.created_utc));
};

getposts('data');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM