Typescript 具有异步构造函数模式的未捕获异常
这个类有点特殊,因为它在构造函数中使用了大量异步调用,而且构造函数不能是异步的,所以我使用了一个我在internet上读到的特殊模式:Typescript 具有异步构造函数模式的未捕获异常,typescript,exception-handling,promise,Typescript,Exception Handling,Promise,这个类有点特殊,因为它在构造函数中使用了大量异步调用,而且构造函数不能是异步的,所以我使用了一个我在internet上读到的特殊模式: export class MapLayer { public Ready: Promise<any>; constructor() { this.instantiate(); } async instantiate(): Promise<void> { return th
export class MapLayer {
public Ready: Promise<any>;
constructor() {
this.instantiate();
}
async instantiate(): Promise<void> {
return this.Ready = new Promise((resolve, reject) => {
this.parseServiceDefiniton().then(() => {
// ...
resolve(undefined);
}).catch((ex) => {
console.log('reject');
reject();
});
});
}
async parseServiceDefiniton(): Promise<boolean> {
throw Error('test');
}
}
由于异常可能发生在parseServiceDefinition
函数中,因此我正在模拟这种情况。目前,我发现以下错误:
未捕获(承诺):[对象未定义]
在控制台中,我看到:
拒绝
未定义
我看不出哪里没有异常 问题是在
实例化中使用async
。使async
成为可能的机制将创建另一个Promise
来包装您返回的Promise
,而此Promise实际上不会捕获它的异常(因为您没有捕获构造函数中的错误)
最简单的解决方案是删除async
。由于在正文中不使用wait
,因此实际上不需要async
:
export class MapLayer {
public Ready!: Promise<any>;
constructor() {
this.instantiate();
}
instantiate(): Promise<void> {
return this.Ready = new Promise((resolve, reject) => {
this.parseServiceDefiniton().then(() => {
// ...
resolve(undefined);
}).catch((ex) => {
console.log('reject');
reject(ex);
});
});
}
async parseServiceDefiniton(): Promise<boolean> {
throw Error('test');
}
}
const lyr: MapLayer = new MapLayer();
lyr.Ready.then(() => {
}).catch(ex => {
console.log(ex);
});
export class MapLayer {
public Ready!: Promise<any>;
constructor() {
this.instantiate();
}
instantiate(): Promise<void> {
return this.Ready = new Promise((resolve, reject) => {
this.parseServiceDefiniton().then(() => {
// ...
resolve(undefined);
}).catch((ex) => {
console.log('reject');
reject(ex);
});
});
}
async parseServiceDefiniton(): Promise<boolean> {
throw Error('test');
}
}
const lyr: MapLayer = new MapLayer();
lyr.Ready.then(() => {
}).catch(ex => {
console.log(ex);
});
export class MapLayer {
public Ready!: Promise<any>;
constructor() {
this.Ready = this.instantiate();
}
async instantiate(): Promise<void> {
try {
await this.parseServiceDefiniton()
} catch (ex) {
console.log('reject');
throw ex;
}
}
async parseServiceDefiniton(): Promise<boolean> {
throw Error('test');
}
}
const lyr: MapLayer = new MapLayer();
lyr.Ready.then(() => {
}).catch(ex => {
console.log(ex);
});