Angularjs 如何将$http与typescript泛型一起使用

Angularjs 如何将$http与typescript泛型一起使用,angularjs,generics,typescript,promise,Angularjs,Generics,Typescript,Promise,我试着用下面的方式返回一个通用的承诺 public getUserPreferences: () => ng.IPromise <string> = () => { var promise = this.makeRequest<string>('http://someurl.com',null) .then((response:string) => { let res: st

我试着用下面的方式返回一个通用的承诺

public getUserPreferences: () => ng.IPromise <string> = () => {
        var promise = this.makeRequest<string>('http://someurl.com',null)
            .then((response:string) => {
                    let res: string = response;
                    return res;
                }
            )
            .catch((error) => {
            });

        return promise;
    };

        public makeRequest<T>(וrl: string, data?: any,
                          config?: any, verb?: HttpMethod): ng.IPromise<T> {
        // Cache key contains both request url and data
        var cacheKey = url + '*' + JSON.stringify(data);

        var deferred = this.$q.defer();
        var httpRequest: any;
        var responseData: T;
        var start = new Date().getTime();

        // Trying to retrieve cache data if needed
        if (!config || config.cache != false) {
            responseData = this.cacheService.get(cacheKey);
        }

        if (responseData) {
            deferred.resolve(responseData);
        }
        else {
            switch (verb) {
                case HttpMethod.GET:
                    httpRequest = this.$http.get(url, config);
                    break;
                case HttpMethod.POST:
                    httpRequest = this.$http.post(url, data, config);
                    break;
                case HttpMethod.PATCH:
                    httpRequest = this.$http.patch(url, data, config);
                    break;
                default:
                    httpRequest = this.$http.post(url, data, config);
                    break;

            }

            httpRequest
                .then((res: any) => {
                    responseData = res.data;
                    this.cacheService.put(cacheKey, responseData);
                    deferred.resolve(responseData);
                })
                .catch((error: any) => {
                    deferred.reject(error);
                });
        }

        return deferred.promise;
    }
publicGetUserPreferences:()=>ng.IPromise=()=>{
var promise=this.makeRequest('http://someurl.com,空)
。然后((响应:字符串)=>{
让res:string=响应;
返回res;
}
)
.catch((错误)=>{
});
回报承诺;
};
公共makeRequest(וrl:string,data?:any,
配置?:任意,动词?:HttpMethod):ng.IPromise{
//缓存键包含请求url和数据
var cacheKey=url+'*'+JSON.stringify(数据);
var deferred=这个$q.deferred();
var httpRequest:任何;
var响应数据:T;
var start=new Date().getTime();
//如果需要,尝试检索缓存数据
如果(!config | | config.cache!=false){
responseData=this.cacheService.get(cacheKey);
}
如果(响应数据){
延迟。解决(响应数据);
}
否则{
开关(动词){
案例HttpMethod.GET:
httpRequest=this.$http.get(url,config);
打破
案例HttpMethod.POST:
httpRequest=this.$http.post(url、数据、配置);
打破
案例HttpMethod.PATCH:
httpRequest=this.$http.patch(url、数据、配置);
打破
违约:
httpRequest=this.$http.post(url、数据、配置);
打破
}
httpRequest
。然后((res:any)=>{
responseData=分辨率数据;
this.cacheService.put(cacheKey,responseData);
延迟。解决(响应数据);
})
.catch((错误:任意)=>{
延迟。拒绝(错误);
});
}
回报。承诺;
}
但我在getUserPreferences上遇到以下错误:

错误:(132,9)TS2322:类型“()=>IPromise”不可分配 键入“()=>IPromise”。类型“IPromise”不可用 可分配给类型“IPromise”。类型“void”不可赋值 键入“字符串”


看起来问题在于您从未使用
responseData
解析承诺:no
resolve(responseData)
表示承诺是使用
未定义的
隐式解析的

试试这个:

public makeRequest<T>(url:string, data?: any): ng.IPromise<T> {
    return this.$http.post(url, data)
           .then((res: any) => {
               return res.data;
           });
}
publicMakeRequest(url:string,data?:any):ng.IPromise{
返回此。$http.post(url,数据)
。然后((res:any)=>{
返回res.data;
});
}
我还删除了多余的延迟对象,您不需要它,因为您可以直接返回承诺


另一个区别。我删除了
catch
块,因为最好将它放在承诺链的末尾(在
getUserPreferences
中)。

我的real makeRequest方法更复杂,因为首先我尝试从缓存中检索值,如果它在缓存中不存在,我想将它添加到缓存中,然后才发送响应,我将从
getUserPreferences
@AlekseyL更新我的questionremove捕获块。谢谢它起作用了!但是如何捕获异常呢?如果这是处理异常的正确位置,并且在发生异常时不希望返回任何内容,那么应该将返回类型定义为
ng.IPromise
。注意,如果你在这里遇到了例外,那么承诺将永远被视为成功。