承诺返回Promise <void | =“”t =“”>而不是预期的对象

时间:2018-05-24 03:36:00

标签: javascript typescript promise

我正在使用类中的Typescript进行简单的获取,它应该返回一个promise,然后我想从这个fetch中获取JSON响应。但是,无论我做了什么更改,函数总是返回Promise<void | T>,这会破坏我的代码中的类型检查。

export class ApiHelper {
    constructor() {     }

    public FetchFromPortal<T>(xyz: string) {

    ------ Other less relevant code -----------

        return fetch(url, options)
            .then((response) => this.CheckStatus(response))
            .then((response) => this.ParseJSON<T>(response))
            .then((response) => { 
                console.log(response);
                return response;
            })
            .catch((error: Error) => { console.log(error) });
    }

    private CheckStatus(response : Response) : Promise<Response> {
        if (response.status >= 200 && response.status < 300) {
            return Promise.resolve(response);
        } else {
            let error = new Error(response.statusText);
            throw error;
        }
    }

    private ParseJSON<T>(response : Response) {
        return response.json() as Promise<T>;
    }
}

然后我随后这样称呼它:

let result = apiHelper.FetchFromPortal<T>(xyz);

根据Typescript,这将返回Promise<void | T>。我已经尝试过如下解决电话中的承诺:

let result = apiHelper.FetchFromPortal<T>(xyz).then(data => { return data });

理论上应解决Promise,但这似乎不起作用。

承诺不解决对象的任何理由?

2 个答案:

答案 0 :(得分:2)

  

承诺没有解决到对象的任何理由?

原因如下:

        })
        .catch((error: Error) => { console.log(error) });

发生异常时,此处理程序将错误记录到控制台并且不返回任何内容。编译器会看到这一点,并将void union成员添加到返回类型。

答案 1 :(得分:2)

  

承诺不解决对象的任何理由?

是的,承诺解决方案发生在某种“异步空间”上,呼叫将始终只返回一个承诺。承诺的结果只是通过then()链转发, never 返回给调用者(因为它们是异步的)。

但我认为您可以使用await

来实现您期望的行为
let result = await apiHelper.FetchFromPortal<T>(xyz);