разница между различными сценариями ios асин c ждут - PullRequest
2 голосов
/ 09 февраля 2020

В чем разница между следующим сценарием ios:

сценарий 1 - асинхронный c - ожидание в топоре ios запрос - НЕ РАБОТАЕТ

export const getAll = async () => {
    const retrievedData = await axios.get('http://localhost:3001/anecdotes'); // should return - Array
    return retrievedData.data;
};


const test = () => {
        let anecdotes = getAll();
        // do something 
    };

Сценарий 2 - асин c - ожидание в вспомогательном методе НЕ РАБОТАЕТ

export const getAll = () => {
    const retrievedData = axios.get('http://localhost:3001/anecdotes'); // should return - Array
    return retrievedData.data;
};


const test = async () => {
        let anecdotes = await getAll();
        // do something 
    };

Сценарий 3 - асин c - ожидание в обеих РАБОТАХ

export const getAll = async() => {
    const retrievedData = await axios.get('http://localhost:3001/anecdotes'); // should return - Array
    return retrievedData.data;
};


const test = async () => {
        let anecdotes = await getAll();
        // do something 
    };

В чем разница между вышеуказанным сценарием ios? Почему работает только третий случай ??

1 Ответ

3 голосов
/ 09 февраля 2020

Почему работает только третий случай ??

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

Кроме того, axios() возвращает обещание, поэтому вам также необходимо использовать .then() или await в качестве возвращаемого значения, чтобы получить результат и из вызова axios().

Сценарий 1

В сценарии 1 ваш getAll() функция - async и возвращает обещание. Тогда ваша функция test() не использует await или .then() для этого обещания:

const test = () => {
        let anecdotes = getAll();
        // do something 
};

Поэтому anecdotes - это просто обещание, и вы фактически не получили значение из обещание. Вам нужно использовать await или .then() в этом обещании, чтобы получить значение.


Сценарий 2

Сценарий 2 имеет немного другую проблему. В getAll() вы делаете это:

export const getAll = () => {
    const retrievedData = axios.get('http://localhost:3001/anecdotes');
    return retrievedData.data;
}

axios.get() возвращает обещание. Итак, retrievedData - это обещание. Это не тот результат, который вы хотите. Когда вы return retrievedData.data, вы просто возвращаете несуществующее свойство обещания, поэтому оно всегда возвращает undefined.


Сценарий 3

В сценарии 3 вы успешно используете await в результате выполнения функции async и в результате вызова axios(), и, таким образом, она работает.

export const getAll = async() => {
    const retrievedData = await axios.get('http://localhost:3001/anecdotes'); // should return - Array
    return retrievedData.data;
};


const test = async () => {
    let anecdotes = await getAll();
    // do something 
};
...