Как ждать функцию выборки в функции?

62
4

Ниже мой код

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

спросил(а) 2021-01-28T02:12:35+03:00 3 месяца, 1 неделя назад
1
Решение
76

Вещи вне 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;

try {
const response = await fetch('https://www.example.com');
const 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.

ответил(а) 2021-01-28T02:12:35+03:00 3 месяца, 1 неделя назад
62

Просто ждите 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;
};

ответил(а) 2021-01-28T02:12:35+03:00 3 месяца, 1 неделя назад
45

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

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

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

вернуть респ.данные;

ответил(а) 2021-01-28T02:12:35+03:00 3 месяца, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема