Цепочка обещаний неизвестных чисел в рекурсивной функции - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь найти лучший способ go об этом вызове службы, когда я сохраняю все данные в одном объекте. Вызов возвращает объект со свойством next_page_url. Если есть next_page_url, функция должна продолжать цепочку. Поскольку я не знаю, что это за URL-адрес, пока не разрешится следующий вызов, мне нужно вызвать их по порядку и разрешить их по порядку. Я также собираю данные по каждому звонку. Я не мог понять, какая структура должна быть такой, какая у меня есть

getDataFromAllPages = (url) => {
     waniKaniAxios.get(url).then(object => {
         if(object.data.pages.next_url){
             return this.getDataFromAllPages(object.data.pages.next_url.replace(waniKaniAxios.defaults.baseURL, ''));
         }
     });
 }

 getWanikaniData = () => {
     this.getDataFromAllPages('/subjects?types=vocabulary').then(result => {
         console.log(result);
     });
 }

1 Ответ

1 голос
/ 28 мая 2020

Абстрагируйте wanikaniax ios .get в другой функции, чтобы сделать рекурсию более понятной.

Вот мой плохо отформатированный код (не знаю, как работает редактор SF), не стесняйтесь задавать любые вопросы, если у вас есть любой. Удачного кодирования.

getWanikaniData = () => {
  this.getDataFromAllPages("/subjects?types=vocabulary")
    .then((result) => {
      console.log(result);
    })
    .catch((err) => {
      console.log(err); // always put a .catch when you're using prmomises.
    });
};

getDataFromAllPages = async (url) => {
  // using async await;

  try {
    let arr = []; // i am assuming you'll improve upon what data structure you might want to return. Linked list seems best to me.

    const object = await waniKaniAxios.get(url);

    if (object.data.pages.next_url) {
      const laterData = await this.getDataFromAllPages(
        object.data.pages.next_url.replace(waniKaniAxios.defaults.baseURL, "")
      );
      arr = [...arr, ...laterData];
    } else {
      arr = [...arr, object];
    }

    Promise.resolve(arr);
  } catch (err) {
    Promise.reject(new Error(`Oops new wanikani error, ${err}`));
  }
};

ОКОНЧАТЕЛЬНОЕ ОБНОВЛЕНИЕ

Используя часть ответа ниже, мне удалось заставить его работать. Пришлось частично отказаться от аспекта рекурсии, потому что я не знал, как преобразовать обещание в данные

Вот последнее решение, которое я придумал

getDataFromAllPages = async (url) => {
  let results = {};
  try {
    //getting intial data
    const initialData = await waniKaniAxios.get(url);
    //using the intial data and mapping out the levels then saving it into results object
    results = this.mapOutLevels(initialData.data, results);
    //get the next page url
    let nextPageUrl = initialData.data.pages.next_url;
    //while there is a next page url keep calling the service and adding it to the results object
    while (nextPageUrl) {
      const laterData = await waniKaniAxios.get(nextPageUrl);
      nextPageUrl = laterData.data.pages.next_url;
      results = this.mapOutLevels(laterData.data, results);
    }
  } catch (err) {
    Promise.reject(new Error(`Opps new wanikani error, ${err}`));
  }
  return Promise.resolve(results);
};

getWanikaniData = () => {
  this.getDataFromAllPages("/subjects?types=vocabulary")
    .then((result) => {
      console.log(result);
    })
    .catch((err) => {
      console.log(err);
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...