Не совсем понятно, как правильно обрабатывать обещания javascript с помощью axios - PullRequest
2 голосов
/ 18 марта 2020

Итак, у меня есть две простые функции, первая функция выполняет вызов API и получает 100 идентификаторов категорий и сохраняет их в массиве. Я использую loda sh, чтобы случайным образом выбрать 6 из этих идентификаторов категории. Предполагается, что вторая функция использует эти 6 уникальных идентификаторов категорий и использует их в строке запроса для следующих 6 вызовов API, сделанных во второй функции.

async function getCategoryIds() {
    const res = await axios.get('http://jservice.io//api/categories?count=100');
    for (let cat of res.data) {
        categories.push(cat.id)
    }
    var sampleCategories = _.sampleSize(categories, 6);
    console.log(sampleCategories);
    return sampleCategories;
}

getCategoryIds()
    .then(getCategory)

async function getCategory(sampleCategories) {
    const res1 = await axios.get(`http://jservice.io/api/category?id=${sampleCategories[0]}`);
    const res2 = await axios.get(`http://jservice.io/api/category?id=${sampleCategories[1]}`);
    const res3 = await axios.get(`http://jservice.io/api/category?id=${sampleCategories[2]}`);
    const res4 = await axios.get(`http://jservice.io/api/category?id=${sampleCategories[3]}`);
    const res5 = await axios.get(`http://jservice.io/api/category?id=${sampleCategories[4]}`);
    const res6 = await axios.get(`http://jservice.io/api/category?id=${sampleCategories[5]}`);
}

getCategory();

Однако, как бы я его не переделывал, я все равно не могу получить эту ошибку на go прочь:

Uncaught (in promise) TypeError: Cannot read property '0' of undefined

Может ли кто-нибудь направить меня в правильное направление?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

если ваш сервер точно отправляет ответ точный массив, то вы должны

не забывайте давать аргументы при вызове функции getCategory

, а затем редактировать функцию getCategory

async function getCategory(sampleCategories) {
    let arr = []
    const res1 = await axios.get('any url you want')
    //repeat 6 times
    arr = [res1, res2, ...otherElems]

   return arr
}

с синтаксисом 'then'

getCategoryIds()
    .then(response => getCategory(response))

с асинхронным c ожидание синтаксиса

const firstResponseArr = await getCategoryIds();
const secondResponseArr = await getCategory(firstResponseArr);
1 голос
/ 18 марта 2020

Ваша ошибка

Вызов getCategory(); с передачей любого аргумента. Очевидно, async function getCategory(sampleCategories) нужен аргумент - sampleCategories, который вы не смогли передать.

Ошибка интерпретации

Uncaught (in promise) TypeError: Cannot read property '0' of undefined # sampleCategories

Вызов getCategory() с аргументом

Ничего не имеет делать с топором ios но с вашей неосторожной ошибкой. (Не волнуйтесь, это случается даже с лучшими из нас)

0 голосов
/ 18 марта 2020

Хорошо, я пытался понять, как правильно использовать async / await - мне показалось, что это работает:

let categories = []
var sampleCategories = []

async function getCategoryIds() {
    const res = await axios.get('http://jservice.io//api/categories?count=100');
    for (let cat of res.data) {
        categories.push(cat.id)
    }
    var sampleCategories = _.sampleSize(categories, 6);
    return sampleCategories;
}

getCategoryIds()

async function getCategory() {

    var y = await getCategoryIds();

    const res1 = await axios.get(`http://jservice.io/api/category?id=${y[0]}`);
    const res2 = await axios.get(`http://jservice.io/api/category?id=${y[1]}`);
    const res3 = await axios.get(`http://jservice.io/api/category?id=${y[2]}`);
    const res4 = await axios.get(`http://jservice.io/api/category?id=${y[3]}`);
    const res5 = await axios.get(`http://jservice.io/api/category?id=${y[4]}`);
    const res6 = await axios.get(`http://jservice.io/api/category?id=${y[5]}`);

    let arr = [res1, res2, res3, res4, res5, res6]

    return arr

}

getCategory();
...