Как пропустить обещание, которое не работает? - PullRequest
0 голосов
/ 24 августа 2018
async function getData() {
  const getProject = await axios.get('url', {
    auth: {
      username: 'username',
      password: 'pw'
    }
  });

  const projects = getProject.data.value;
  const promises = projects.map(project =>
    axios.get(`url`, {
      auth: {
        username: 'username',
        password: 'pw'
      }
    })
  );

  const results = await axios.all(promises)

  const KPIs = results.map(v => v.data.value);
}

Я пытаюсь сделать следующее:

  1. получить вызов axios для получения имени проектов.

  2. Используйте эти выбранные имена для вызова нескольких вызовов Axios.Предполагается, что это даст мне некоторые данные из этого проекта.

Когда я делаю второй вызов axios, есть некоторые вызовы API, которые не будут работать, потому что данные не существуют в этомпроект.Это было предназначено.Но он сломается, выдав мне ошибку 404, и не достигнет линии const results = await axios.all(promises).

Я хочу, чтобы он пропускал это всякий раз, когда он не существовал, и вызывал его только из того, который существует, и сохранял извлеченные данные в KPIs.Как я могу это сделать?

РЕДАКТИРОВАТЬ

Первый вызов axios возвращает массив объектов

ex) {id: "id...", name: "Javelin", url: " .visualstudio.com/_apis/projects/6a93eab2-4996-4d02-8a14-767f02d94993", state: "wellFormed", revision: 99, …}

Что-то вроде того.Итак, я буквально просто получаю .name этого объекта и помещаю его в свой URL-адрес как:

axios.get({id}.extmgmt.visualstudio.com/_apis/ExtensionManagement/InstalledExtensions/{id}/..../${project.name}_test/Documents

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Если проблема с извлечением данных проекта, вам просто нужно обработать ошибки, которые там возникают, один из способов - просто перехватить ошибку и вместо нее вернуть null.

const promises = projects.map(project =>
    axios.get(`url`, {
      auth: {
        username: 'username',
        password: 'pw'
      }
    }).catch(err => {
        return null;
    })
  );
0 голосов
/ 24 августа 2018

Вы можете легко это исправить, обработав 404 ответы самостоятельно и продолжая отклонять все остальные ошибки следующим образом:

const promises = projects.map(project =>
  axios.get(`url`, {
    auth: {
      username: 'username',
      password: 'pw'
    }
  }).catch(err => {
    if (err.response.status === 404) {
      return null; // or an empty array or whatever you want
    }
    throw err;
  });
);

Подробнее см. https://github.com/axios/axios#handling-errors.

0 голосов
/ 24 августа 2018

Это оборачивает вызов в обещание, которое не выполнится.

Вам также нужно учесть, что вы, вероятно, хотите отфильтровать нулевые ответы.

async function getData() {
    const getProject = await axios.get('url', {
        auth: {
            username: 'username',
            password: 'pw'
        }
    });

    const projects = getProject.data.value;
    const promises = projects.map(fallible);

    const results = await axios.all(promises)

    const KPIs = results.filter(v => v).map(v => v.data.value);
}

function fallibleCall(project) {
    return new Promise((resolve, reject) => {
        axios.get(`url`, {
            auth: {
                username: 'username',
                password: 'pw'
            }
        }).then(resolve).catch(resolve);
    })
}
...