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

问题描述 投票:0回答:1

我的问题

我有一个异步方法

populate()
尝试做某事,如果它失败了,捕获错误并调用另一个异步方法
populateFromServer()
(也可能失败)。 如果没有尝试,我会在
Promise.all()
中用
catch
调用第一个。但是,
.all()
总是因为
populate()
而触发,不知道为什么,虽然应该被抓到。 这是我的代码(打字稿)的简化版本:

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 */)

我的代码似乎在

Promise.all
之后当
populate()
失败时被捕获,即使我捕获了它并且
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();
  }
}
javascript typescript asynchronous promise
1个回答
0
投票

问题出在我

.then
Promise.all

方法上
Promise.all([
  ChildDB1.populate(),
  ChildDB2.populate(),
  ChildDB3.populate(),
])
.then(() => /* stuff */)  // <-- this is the part that failed silently
.catch(() => /* other stuff */)
© www.soinside.com 2019 - 2024. All rights reserved.