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
解析承诺:noresolve(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
。注意,如果你在这里遇到了例外,那么承诺将永远被视为成功。