我有一个异步方法
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();
}
}
问题出在我
.then
的
Promise.all
方法上
Promise.all([
ChildDB1.populate(),
ChildDB2.populate(),
ChildDB3.populate(),
])
.then(() => /* stuff */) // <-- this is the part that failed silently
.catch(() => /* other stuff */)