Я перебираю массив и делаю вызов REST API для каждого элемента, но у меня проблемы с асинхронным характером js. Я пытаюсь использовать async/await, но не думаю, что правильно его настраиваю, потому что он не будет ждать ответа и вернет undefined.
onSearchSuccess = async (response) => {
const persons = response._embedded.persons_search_collection;
const personsWithClasses = await persons.reduce(
(acc, person) => {
const params = {
person_id: person.person_id,
date: '2017-01-05',
enrollment_status: 3,
class_status: 2,
};
return getClasses( //this function does an GET request and returns the response
params,
(classesResponse) => {
const { classes } = classesResponse._embedded;
console.log(classes); //logs after the console.log below
return [...acc, { ...person, classes }];
},
() => acc,
);
}, []);
console.log(personsWithClasses); //return undefined
}
export const getClasses = (params, success, error) => {
axios.get(`${uri}/classes`, { params })
.then(({ data }) => {
success(data);
})
.catch(err => error(err));
};
getClasses
возвращают обещание, то вы не можете выполнить[...acc]
, потому чтоacc
будет обещанием. Почему вы используетеreduce
здесь? Чего точно вы пытаетесь достичь? Вы хотите выполнить все REST последовательно? Или просто ждать, пока все запросы не будут выполнены? - person Felix Kling   schedule 01.03.2017getClasses
? - person Matt Aft   schedule 01.03.2017reduce
является синхронным. Использование асинхронной функции (что такоеgetClasses
) в качестве обратного вызоваreduce
не имеет смысла. Вместо этого используйте.map
иPromise.all
. - person Felix Kling   schedule 01.03.2017getClasses
возвращает обещание, которое было отклонено? - person Felix Kling   schedule 02.03.2017