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);


皈依舞
浏览 306回答 1
1回答

猛跑小猪

那里有几个问题。错误消息是因为您使用的是<T[]>onget和toPromise,它们不是通用函数。只需在处理程序中应用类型T即可。resultthen您正在陷入承诺创建反模式。您已经有一个承诺(来自this.httpClient),因此您不需要new Promise.您正在为new Promise回调使用传统函数,但随后this在其中使用,就好像它仍在引用您的类实例一样。如果你要保留new Promise,你会想要一个箭头函数,所以它关闭了this。相反(见***评论):protected scroll<T>(path: string, pageSize: number, filter: string, data: T[]): Promise<T[]> {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; // *** Return the result of calling `then` on the promise from `toPromise`&nbsp; &nbsp; return this.httpClient&nbsp; &nbsp; &nbsp; &nbsp; // *** Don't use <T[]> on `get` and `toPromise`&nbsp; &nbsp; &nbsp; &nbsp; .get(this.appConfigService.buildApiUrl(path), { params })&nbsp; &nbsp; &nbsp; &nbsp; .toPromise()&nbsp; &nbsp; &nbsp; &nbsp; .then((result: T) => { // *** <== Note the `T`&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // *** If it's really possible that `result` will be falsy and you don't want that&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // to be valid, you can do this:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!result) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new Error("appropriate error here");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return data.concat(result);&nbsp; &nbsp; &nbsp; &nbsp; });}在操场上更新:我不应该从示例中删除 if 条件:没关系,把上面的body放入ifblock即可:protected scroll<T>(path: string, pageSize: number, filter: string, data: T[]): Promise<T[]> {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; if (!filter) {&nbsp; &nbsp; &nbsp; &nbsp; const params = new HttpParams()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.set('searchText', '')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.set('skip', data.length.toString())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.set('take', pageSize.toString());&nbsp; &nbsp; &nbsp; &nbsp; return this.httpClient&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // *** Don't use <T[]> on `get` and `toPromise`&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .get(this.appConfigService.buildApiUrl(path), { params })&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .toPromise()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .then((result: T) => { // *** <== Note the `T`&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // *** If it's really possible that `result` will be falsy and you don't want that&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // to be valid, you can do this:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!result) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new Error("appropriate error here");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return data.concat(result);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }&nbsp; &nbsp; return this.filter<T>(data, pageSize, filter, path);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript