Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 具有异步构造函数模式的未捕获异常_Typescript_Exception Handling_Promise - Fatal编程技术网

Typescript 具有异步构造函数模式的未捕获异常

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

这个类有点特殊,因为它在构造函数中使用了大量异步调用,而且构造函数不能是异步的,所以我使用了一个我在internet上读到的特殊模式:

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);
});