在我的代码中,我试图并行调度作业(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()
返回的数组(它不会做任何事情-你只能await
Promise.allSettled()
返回的承诺),你想要await
updateActor()
返回的承诺,这样拒绝将被try
/catch
块捕获。