Почему работает только третий случай ??
Все 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
};