Преобразование ответа JSON в объект TypeScript с помощью JsonConvert работает во всех случаях, кроме одного - PullRequest
0 голосов
/ 09 апреля 2020

Я создал пару сервисов, которые извлекают данные из моего API, преобразуют их в объекты TypeScript и возвращают их как обещание:

public getProductsFromApi(): Promise<Product[]> {
    const url: string = `${this.baseUrl}/products`;
    return fetch(url, {
        method: "GET",
        credentials: this.credentials,
    })
        .catch(this.checkErrors)
        .then((jsonResponse) => {
            return jsonResponse.map((jsonProduct: string) => {
                const jsonConvert: JsonConvert = new JsonConvert();
                return jsonConvert.deserializeObject(jsonProduct, Product);
            });
        });
}

По некоторым причинам функции никогда не возвращают массив продукты, и поэтому функция, которая вызывает эту функцию, не получает обещание ...

Моя checkErrors функция выглядит так:

public checkErrors(response: any) {
        if (response.status >= 200 && response.status <= 299) {
            const jsonResponse = response.json();
            return jsonResponse;
        } else {
            throw Error(response.statusText);
        }
    }

Я пытался использовать deserializeArray, Я попытался сделать forEach и отправить преобразованный Products в массив, а затем вернуть массив, но ничего не работает.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Попробуйте это:

public getProductsFromApi(): Promise<Product[]> {
    const url: string = `${this.baseUrl}/products`;
    return new Promise((resolve, reject) =>{
        fetch(url, {
        method: "GET",
        credentials: this.credentials,
        })
        .then((jsonResponse) => {
            resolve(jsonResponse.data.map((jsonProduct: string) => {
                const jsonConvert: JsonConvert = new JsonConvert();
                return jsonConvert.deserializeObject(jsonProduct, Product);
            }));
          })
        .catch(res => reject(this.checkErrors(res)));
    });
0 голосов
/ 10 апреля 2020

Согласно документам jsonConvert.deserializeObject ожидает объект в качестве первого ввода, а не строку. Таким образом, вы должны сначала JSON.parse() строка.

jsonConvert.deserializeObject(JSON.parse(jsonProduct), Product)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...