首页 > 解决方案 > 在 Javascirpt 中从返回的承诺中捕获错误

问题描述

我在服务模块的 Vuejs 应用程序中有以下方法:

static async tenantsByRoles(roles) {
    const promises = [];
    roles.forEach((role) => {
      promises.push(this.fetch(role.tenantCode));
    });
    const tenants = await Promise.all(promises);
    return tenants.map(tenant => new Tenant(tenant.data));
  }

我需要做的是捕捉任何错误,特别是任何调用this.fetch(role.tenantCode))

static async fetch(tenantCode) {
    return await super.perform(axios.get(ServiceUrlProvider.myUrl().concat('/tenant/').concat(tenantCode)));
  }

因为其中一些将是 404(不幸的是,这是我无法控制的)。

我这样修改以附加一个.catch()方法Promise.all()

static async tenantsByRoles(roles) {
    const promises = [];
    roles.forEach((role) => {
      promises.push(this.fetch(role.tenantCode));
    });
    const tenants = await Promise.all(promises)
      .catch((e) => {
        console.log(e);
      });
    return tenants.map(tenant => new Tenant(tenant.data));
  }

但什么都没有被.catch(). 我想要做的是捕捉 404 抛出的错误并抑制它们。从我读过的内容来看,我做得catch()正确,但它不起作用。

我也尝试过单独解决承诺,像这样

static async tenantsByRoles(roles) {
    const promises = [];
    roles.forEach((role) => {
      promises.push(this.fetch(role.tenantCode));
    });
    const tenants = [];
    promises.forEach((promise) => {
      const resolved = Promise.resolve();
    });
    // const tenants = await Promise.all(promises);
    return tenants.map(tenant => new Tenant(tenant.data));
  }

但我不确定resolve()在这种情况下要传递什么。这是我第一次深入了解 Promise,所以我试图弄清楚这一切。

标签: javascriptvuejs2promiseasync-await

解决方案


您无需在 fetch 方法中等待您的承诺。它可以返回承诺(我猜 super.perform() 是一个承诺),这将由 Promise.all() 等待。

static fetch(tenantCode) {
    return super.perform(axios.get(ServiceUrlProvider.myUrl().concat('/tenant/').concat(tenantCode)));
}

然后为了捕获任何错误,无论是对应于您的函数的异步性质还是同步 javascript 错误,您都可以简单地使用 try/catch。能够使用这种语法捕获异步错误是 async/await 语法的众多优点之一。

static async tenantsByRoles(roles) {
    try {
        const promises = roles.map((role) => {
            return this.fetch(role.tenantCode)
        });
        const tenants = await Promise.all(promises);
        return tenants.map(tenant => new Tenant(tenant.data));
    } catch (e) {
       //handle your error here
        console.error(e)
    }
}

推荐阅读