调用后检查错误 Promise.allSettled
Inspecting Errors after calling Promise.allSettled
在我的代码中,我尝试并行分派作业(FoundryVTT 数据对象迁移),并捕获途中的任何错误。
在他们完成所有 运行 课程后,我正在尝试一起打印错误详细信息。问题是个别演员的错误没有被“捕获”,但我可以看到最后被拒绝的承诺。这是我的代码:
const actorMigrations = await game.actors.contents.map((actor) => {
try {
return this.updateActor(actor);
} catch (err) {
throw new Error(`${actor.name} had a migration error: ${err.message}`);
}
});
const values = await Promise.allSettled(actorMigrations);
for (const value of values.filter((v) => v.status !== "fulfilled")) {
LOGGER.error(`Migration error: ${value.reason.message}`);
LOGGER.error(value.reason.stack);
return false;
}
在这里我应该遵循什么样的正确模式?
我想你正在寻找
const actorMigrations = game.actors.contents.map((actor) => {
// ^
try {
return await this.updateActor(actor);
// ^^^^^
} catch (err) {
throw new Error(`${actor.name} had a migration error: ${err.message}`);
}
});
您不需要 await
map()
returns 的数组(它不会做任何事情 - 您只能 await
Promise.allSettled()
returns),你会想要 updateActor()
returns 这样拒绝就会被 try
/catch
块。
在我的代码中,我尝试并行分派作业(FoundryVTT 数据对象迁移),并捕获途中的任何错误。
在他们完成所有 运行 课程后,我正在尝试一起打印错误详细信息。问题是个别演员的错误没有被“捕获”,但我可以看到最后被拒绝的承诺。这是我的代码:
const actorMigrations = await game.actors.contents.map((actor) => {
try {
return this.updateActor(actor);
} catch (err) {
throw new Error(`${actor.name} had a migration error: ${err.message}`);
}
});
const values = await Promise.allSettled(actorMigrations);
for (const value of values.filter((v) => v.status !== "fulfilled")) {
LOGGER.error(`Migration error: ${value.reason.message}`);
LOGGER.error(value.reason.stack);
return false;
}
在这里我应该遵循什么样的正确模式?
我想你正在寻找
const actorMigrations = game.actors.contents.map((actor) => {
// ^
try {
return await this.updateActor(actor);
// ^^^^^
} catch (err) {
throw new Error(`${actor.name} had a migration error: ${err.message}`);
}
});
您不需要 await
map()
returns 的数组(它不会做任何事情 - 您只能 await
Promise.allSettled()
returns),你会想要 updateActor()
returns 这样拒绝就会被 try
/catch
块。