Угловое использование обещания с генериками внутри обещания - PullRequest
0 голосов
/ 25 октября 2019

Мне нужно чередовать обещания в моем приложении:

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

Моя проблема заключается в том, что я получаю следующее сообщение: «Нетипизированные вызовы функций могут не принимать аргументы типа»

Как мне решитьthis?

ОБНОВЛЕНИЕ:

Я не должен был удалять условие 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);

1 Ответ

1 голос
/ 25 октября 2019

Здесь есть несколько проблем.

  1. Сообщение об ошибке вызвано тем, что вы используете <T[]> на get и toPromise, которые не являются общими функциями,Просто примените тип T к result в обработчике then.

  2. Вы попадаете в антипаттерн создания обещания. У вас уже есть обещание (от this.httpClient), поэтому вам не нужно new Promise.

  3. Вы используете традиционную функцию для 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 из примера:

Неважно, просто поместите вышеуказанное тело в блок if:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...