异步/等待尝试捕获错误处理

时间:2017-11-21 02:38:45

标签: angular typescript

我正在使用JSONPlaceholder API:https://jsonplaceholder.typicode.com。我的service.ts

中有以下内容
public async getPosts(): Promise<Post[]> {
    try {
        const response = await this._http.get<Post[]>(this._baseUrl + "api/JsonPlaceholder/GetPosts");
        return response.toPromise();
    } catch (error) {
        await this.handleError(error);
    }
}

我尝试在component.ts中使用

public posts: Post[];

public async ngOnInit() {
    const posts = await this._placeholderService.getPosts();
    this.posts = posts;
}

但是,TypeScript编译器会在public async getPosts(): Promise<Post[]> - Function lacks ending return statement and return type does not include 'undefined'.

上引发错误

期望在catch块中或try-catch外部返回return语句。当我想要返回特定类型时,在我的情况Post[]中处理这样的错误的最佳做法是什么。有没有更好的方法来构建这些类型的调用?

2 个答案:

答案 0 :(得分:6)

handleError做什么?当http请求失败时,您希望发生什么?现在你正在吞下错误并返回undefined。您可以将返回类型注释修复为Promise<Post[] | undefined>(或删除它将推断该类型),然后您需要处理上游代码中的undefined案例:

public async ngOnInit() {
    const posts = await this._placeholderService.getPosts();
    if (posts) {
        this.posts = posts;
    } else {
        this.errorMessage = "Failed to load posts!";
    }
}

如果您还没有处理错误案例,那么您可以return []

} catch (error) {
    await this.handleError(error);
    return [];
}

或者您可以抛出错误并允许上游代码处理它:

} catch (error) {
    await this.handleError(error);
    throw error;
}

public async ngOnInit() {
    try {
        const posts = await this._placeholderService.getPosts();
        this.posts = posts;
    } catch(error) {
        // Note that 'error' could be almost anything: http error, parsing error, type error in getPosts(), handling error in above code
        this.errorMessage = "Failed to load posts!";
    }
}

答案 1 :(得分:2)

  

期望在catch块中或try-catch外部返回return语句。当我想要返回特定类型时,处理这类错误的最佳做法是什么...在我的案例中发布[]。有没有更好的方法来构建这些类型的调用?

简单注释,以反映您编写的代码的真实性质:

{{1}}

TypeScript只是为你指出了这个事实