javascript - Angular 使用 Promise 和 Promise 中的泛型
问题描述
我需要在我的应用程序中交错承诺:
protected scroll<T>(path: string, pageSize: number, filter: string, data: T[]): Promise<T[]> {
let promise = new Promise<T[]>(function(resolve, reject) {
this.httpClient
.get<T[]>(this.appConfigService.buildApiUrl(path), { params })
.toPromise<T[]>()
.then(result => {
if (result) {
resolve(data.concat(result));
}
})
.catch(function(e) {
reject(e);
});
});
return promise;
}
我的问题是我收到以下消息:'无类型函数调用可能不接受类型参数'
我将如何解决这个问题?
更新:
我不应该从示例中删除 if 条件:
if (!filter) {
const params = new HttpParams()
.set('searchText', '')
.set('skip', data.length.toString())
.set('take', pageSize.toString());
const promise = new Promise<T[]>((resolve, reject) => {
this.httpClient
.get<T>(this.appConfigService.buildApiUrl(path), { params })
.toPromise<any>()
.then(result => {
if (result) {
resolve(data.concat(result));
}
resolve(data);
})
.catch(e => reject(e));
});
return promise;
}
// also returning a promise
return this.filter<T>(data, pageSize, filter, path);
解决方案
那里有几个问题。
错误消息是因为您使用的是
<T[]>
onget
和toPromise
,它们不是通用函数。只需在处理程序中应用类型T
即可。result
then
你陷入了承诺创建反模式。你已经有一个承诺(来自
this.httpClient
),所以你不需要new Promise
.您正在为
new Promise
回调使用传统函数,但随后this
在其中使用它,就好像它仍然引用您的类实例一样。如果要保留new Promise
,则需要一个箭头功能,因此它会关闭this
。
相反(见***
评论):
protected scroll<T>(path: string, pageSize: number, filter: string, data: T[]): Promise<T[]> {
// *** Return the result of calling `then` on the promise from `toPromise`
return this.httpClient
// *** Don't use <T[]> on `get` and `toPromise`
.get(this.appConfigService.buildApiUrl(path), { params })
.toPromise()
.then((result: T) => { // *** <== Note the `T`
// *** If it's really possible that `result` will be falsy and you don't want that
// to be valid, you can do this:
if (!result) {
throw new Error("appropriate error here");
}
return data.concat(result);
});
}
更新:
我不应该从示例中删除 if 条件:
没关系,把上面的body放入if
block中即可:
protected scroll<T>(path: string, pageSize: number, filter: string, data: T[]): Promise<T[]> {
if (!filter) {
const params = new HttpParams()
.set('searchText', '')
.set('skip', data.length.toString())
.set('take', pageSize.toString());
return this.httpClient
// *** Don't use <T[]> on `get` and `toPromise`
.get(this.appConfigService.buildApiUrl(path), { params })
.toPromise()
.then((result: T) => { // *** <== Note the `T`
// *** If it's really possible that `result` will be falsy and you don't want that
// to be valid, you can do this:
if (!result) {
throw new Error("appropriate error here");
}
return data.concat(result);
});
}
return this.filter<T>(data, pageSize, filter, path);
}
推荐阅读
- android - 我如何才能为我的 androidTest 提供本地化文本字符串
- python-3.x - 如何验证 Pika 1.0.0 "basic_publish" 方法是否成功执行
- reactjs - 为什么日期范围选择器反应日期给出错误?
- java - Eureka 主页中的警告,我可以知道它的含义吗?
- react-native - 参数更改时反应导航不会刷新页面
- xcode - 在 macOS Cocoa App 中诊断 KVO 崩溃的步骤
- android - 我的 Android 应用程序无法在大学代理后面运行?
- php - 无法让 Xdebug 工作(mac+PhpStorm+Laradock+Xdebug)
- python - Postgres:以 5 秒的间隔顺序检索记录
- pandas - 优化 groupby 排除最后一行