Как ждать функцию выборки в функции? - PullRequest
1 голос
/ 22 апреля 2019

Ниже мой код

export const redirectDomain: any = (lang, ctx, res) => {
    let redirectString;

    const getData = async () => {
        try {
            const response = await fetch('https://www.example.com');
            const data= await response.json();

            return data;
        } catch (error) {
            console.log('[ERROR]');
        }
    };

    const data = getData();
    const redirectUrl = data.split(',');

    return redirectUrl;
};

Почему на выходе будет отображаться ошибка

Невозможно прочитать свойство split из undefined

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

Вещи за пределами функции async не будут ждать разрешения обещания. И поэтому data все еще undefined, когда вы split это. Итак, вот одно из решений ...

export const redirectDomain: any = async (lang, ctx, res) => {
    let redirectString;

    const getData = async () => {
        try {
            const response = await fetch('https://www.example.com');
            const data = await response.json();

            return data;
        } catch (error) {
            console.log('[ERROR]');
        }
    };

    const data = await getData();
    const redirectUrl = data.split(',');

    return redirectUrl;
};

Другое решение (я бы предпочел это):

export const redirectDomain: any = async (lang, ctx, res) => {
    let redirectString;
    let data;
    try {
        const response = await fetch('https://www.example.com');
        data = await response.json();
    } catch (error) {
        console.log('[ERROR]');
    }

    const redirectUrl = data.split(',');

    return redirectUrl;
};

Также, если бы мне пришлось написать этот фрагмент кода (позвольте мне выяснить, как бы я обработал ошибку xD):

export const redirectDomain: any = (lang, ctx, resp) =>
    fetch("https://www.example.com")
    .then(res => res.json())
    .then(data => Promise.resolve(data.split(",")));

Я хотел бы подчеркнуть, что иногда обещания выглядят лучше, чем async / await.

1 голос
/ 22 апреля 2019

Просто ждите getData, redirectDomain должно быть async, чтобы сделать это

-export const redirectDomain: any = (lang, ctx, res) => {
+export const redirectDomain: any = async (lang, ctx, res) => {
    let redirectString;

    const getData = async () => {
        try {
            const response = await fetch('https://www.example.com');
            const data= await response.json();

            return data;
        } catch (error) {
            console.log('[ERROR]');
        }
    };

-   const data = getData();
+   const data = await getData();
    const redirectUrl = data.split(',');

    return redirectUrl;
};
0 голосов
/ 22 апреля 2019

Вы получаете эту ошибку, потому что ваши данные не определены

Попробуйте axios библиотеку, альтернативу извлечению

const resp = axios.get('https://www.example.com');

return resp.data;

...