Javascript - Axios в течение цикла. Использование ответа текущей выборки для следующей итерации выборки данных - PullRequest
0 голосов
/ 28 мая 2019

Я использую переменную previous_epoch для получения сообщений reddit до сегодняшнего дня в первой итерации.Следующая итерация previous_epoch должна содержать дату из данных ответа.Как ни странно, дата не меняется после первых двух циклов

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); */
}

Функция 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)
    })
  })
}

здесь - скрипка

РЕДАКТИРОВАТЬ 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);
}

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Попробуйте этот код

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');
1 голос
/ 28 мая 2019

На первой итерации вы выбираете посты до сегодняшнего дня, поэтому в последнем посте результат будет равен create_utc до или равен сегодняшнему дню.Следующие итерации просто повторяют ваш первый запрос.

Попробуйте этот код

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);        
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...