【问题标题】:How to skip a promise that doesn't work?如何跳过无效的承诺?
【发布时间】:2019-01-31 03:24:25
【问题描述】:
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 调用返回一个对象数组

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

类似的东西。所以,我实际上只是得到了这个对象的.name 并将其放入我的网址中,例如:

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

【问题讨论】:

  • 您可以将axios.get 调用包装在另一个不会在axios.get 被拒绝时被拒绝的承诺中。
  • 我该怎么做?你能帮我做吗?
  • 好的,请给我一秒钟写下来
  • 太棒了。我真的很感激!
  • @RyanSearle 我也是这么想的,所以我怀疑有没有更好的方法。

标签: javascript asynchronous promise axios


【解决方案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);
    })
}

【讨论】:

  • 我很高兴听到这个消息!
  • @str 是的,我通常不会像这样创建 Promises,因为在 then 方法中返回一个值会返回一个新的承诺,但如果你试图处理一个捕获情况,它不是世界上最糟糕的事情。
  • @str 我在其他示例中看到的问题是,它们返回的承诺处于待处理状态,这似乎不合逻辑,可能会导致其他实现出现问题。
  • @RyanSearle 好吧,没用。您的代码返回 return new Promise,这也是一个处于待处理状态的 Promise。这就是 Promises 的本意。
【解决方案2】:

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

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

【讨论】:

  • 这给了我Unhandled Rejection (TypeError): Cannot read property 'data' of null就行了const KPIs = results.map(v => v.data.value);
  • results.filter(value => value !== null).map(v => v.data.value)
  • 感谢这也解决了。但是很抱歉我接受了另一个。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 2022-01-12
    • 2014-08-12
    • 2017-10-13
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多