Обещание вернуть возвращение обещаниевместо ожидаемого объекта - PullRequest
0 голосов
/ 24 мая 2018

Я делаю простую выборку, используя Typescript в классе, который должен вернуть обещание, затем я хочу получить ответ JSON из этой выборки.Однако, независимо от того, какое изменение я внесу, функция всегда возвращает Promise<void | T>, что разрушает проверку типов в моем коде.

export class ApiHelper {
    constructor() {     }

    public FetchFromPortal<T>(xyz: string) {

    ------ Other less relevant code -----------

        return fetch(url, options)
            .then((response) => this.CheckStatus(response))
            .then((response) => this.ParseJSON<T>(response))
            .then((response) => { 
                console.log(response);
                return response;
            })
            .catch((error: Error) => { console.log(error) });
    }

    private CheckStatus(response : Response) : Promise<Response> {
        if (response.status >= 200 && response.status < 300) {
            return Promise.resolve(response);
        } else {
            let error = new Error(response.statusText);
            throw error;
        }
    }

    private ParseJSON<T>(response : Response) {
        return response.json() as Promise<T>;
    }
}

Затем я впоследствии называю это так:

let result = apiHelper.FetchFromPortal<T>(xyz);

Согласно Typescript, это возвращает Promise<void | T>.Я попытался разрешить обещание в вызове следующим образом:

let result = apiHelper.FetchFromPortal<T>(xyz).then(data => { return data });

Что теоретически должно разрешить Promise, но, похоже, это не работает.

Есть ли причина, по которой обещание не сводится только к объекту?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Есть ли причина, по которой обещание не относится только к объекту?

Да, разрешение обещания происходит в каком-то «асинхронном пространстве», вызов всегда просто возвращает обещание.Результат обещания просто пересылается по цепочке then() и никогда не возвращается вызывающей стороне (потому что они асинхронные).

Но я думаю, что вы можете иметь ожидаемое поведениеиспользуя await:

let result = await apiHelper.FetchFromPortal<T>(xyz);
0 голосов
/ 24 мая 2018

Любая причина, по которой обещание не разрешается только для объекта?

Вот причина:

        })
        .catch((error: Error) => { console.log(error) });

Когда происходит исключение, этот обработчик регистрируетошибка в консоли и ничего не возвращает.Компилятор видит это и добавляет void член объединения к типу возвращаемого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...