如何跳过无效的承诺?

时间:2018-08-24 15:54:46

标签: javascript asynchronous promise axios

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 :(得分:1)

这会将呼叫包装在不会失败的承诺中。

您还需要考虑可能要过滤掉空响应的情况。

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

答案 1 :(得分:1)

如果问题在于获取项目数据,您只需要处理在那里发生的错误,一种方法就是简单地捕获错误并返回null

const promises = projects.map(project =>
    axios.get(`url`, {
      auth: {
        username: 'username',
        password: 'pw'
      }
    }).catch(err => {
        return null;
    })
  );

答案 2 :(得分:1)

您可以通过自己处理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