javascript 捕获的错误仍然触发Promises的`.catch`方法

icnyk63a  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(154)

我的问题

我有一个异步方法populate(),它尝试执行某些操作,如果失败,则捕获错误并调用另一个异步方法populateFromServer()。(这也可能失败).我调用的第一个在一个Promise.all()与一个catch后,以防没有尝试工作.然而,.all()总是触发,因为populate(),出于某种原因,下面是我的代码的简化版本(typescript):

abstract class Database {
  public static async populate() {
    try {
      await populateFromLocalFile();
    } catch (err) {
      await this.populateFromServer();
    }
  }

  private static async populateFromServer() {
    await fetchFromServer();  // Might fail eg. if there is no internet
  }
}

在其他地方:

Promise.all([
  ChildDB1.populate(),
  ChildDB2.populate(),
  ChildDB3.populate(),
])
.then(() => /* population worked (either local or distant) */)
.catch(() => /* no population attempt worked */)

populate()失败时,我的代码似乎在Promise.all之后被捕获,即使我捕获了它并且populateFromServer()工作得很好(我检查了日志)。为什么?我如何修复这个问题?

我所尝试的

返回Promise.resolve()

有人建议在catch块的末尾返回Promise.resolve(),但这并没有解决问题:

public static async populate() {
    try {
      await populateFromLocalFile();
    } catch (err) {
      await this.populateFromServer();
      return Promise.resolve()
    }
    return Promise.resolve()
  }
使用.then

我也试过用.then的另一种方式,但我仍然有这个问题

abstract class Database {
  public static async populate() {
    await populateFromLocalFile()
      .then(() => doStuff())
      .catch(async () => {
          console.log('error happened here');
          await this.populateFromServer();
      });
  }

  private static async B() {
    await fetchFromServer();
  }
}
z9gpfhce

z9gpfhce1#

问题出在我的Promise.all.then方法中

Promise.all([
  ChildDB1.populate(),
  ChildDB2.populate(),
  ChildDB3.populate(),
])
.then(() => /* stuff */)  // <-- this is the part that failed silently
.catch(() => /* other stuff */)

相关问题