Я пытаюсь получить данные с конечной точки. Тем не менее, все работает нормально, за исключением крошечной ошибки, которую, как мне кажется, я делаю, но я не очень хорошо осведомлен об этой конкретной структуре.
Я использую forEach () внутри .then (), и теперь я хочу передать возвращаемое значение forEach следующему обещанию .then () И не создавать новый .then () внутри другого .then ()
const url = 'https://jsonplaceholder.typicode.com/users';
/*r = response, v = value, e = error, n = names array, iv = item value */
axios.get(url)
.then( r => r )
.then( r => r.data )
.then( r => r.map( v => v ) )
.then( r => {const n = r; return n} )
.then( n => { n.forEach( v => v) } )
.then( /* HERE I WANT TO IMPLEMENT THE RETURNED VALUE FROM THE PREVIOUS FOREACH() FUNCTION*/ )
.catch( e => e.respose ? console.info(e.response.status) : console.info(e.message) )
КОД ОБНОВЛЕН
axios.get(url)
.then( response => response.data )
/* Creates a copy from the responded array */
.then(
response => {
const new_array = response.map( value => value )
return new_array;
}
)
/*
Gets the name property for each value inside the copied array and stores it into a new array called names_array
*/
.then(
new_array => {
const names_array = [];
new_array.forEach(
item => names_array.push(item.name)
)
return names_array
}
)
.then(
names => {
console.info(names.sort( (a, b) => b-a) )
}
)
/* Error handling */
.catch( e => e.respose ? console.info(e.response.status) : console.info(e.message) )
Это ваш настоящий код? Ни .then( r => r )
, ни .then( r => r.map( v => v ) )
, ни .then( r => {const n = r; return n} )
не имеют никакого смысла.
Берги, проблема здесь не в том, как назвать моего друга.
И да, это фактический код, который я пишу.
Для чего именно вы собираетесь использовать forEach? Также у вас гораздо больше then()
, чем нужно
Конечная точка (jsonplaceholder.typicode.com/users) возвращает массив с объектами, и каждый объект имеет такие свойства, как имя, фамилия и т. д. Ну, я пытаюсь, например, получить имена и управлять ими в другом .then ().
Сделайте это на своем map()
, который в настоящее время бесполезен и избыточен.
так что такая цепочка не поможет! Я пытался реализовать это так, чтобы писать чистый код! Также с точки зрения производительности не станет лучше?
Большая часть показанной цепочки не имеет смысла и представляет собой не что иное, как бесполезное раздувание кода.
@evangelos Они не имеют смысла не потому, что их имена не имеют смысла, а потому, что все эти обратные вызовы ничего не делают. Они производят точно такое же значение результата, которое им было введено. Отбросьте их, и ваш код будет работать так же.
@charlietfl и Bergi спасибо за ваши ответы, друзья мои! Кроме того, я обновил код. Не могли бы вы сообщить мне, верен ли этот подход?
Если все, что вам нужно, это массив имен из объектов ответа, вы слишком усложняете все это с помощью бесполезного then()
в цепочке.
Создание const new_array = response.map( value => value )
- бессмысленный шаг, заключающийся в простом копировании исходного массива без всякой причины.
Все, что вам нужно, это простой map()
, чтобы вернуть имена в первом then()
.
const url = 'https://jsonplaceholder.typicode.com/users';
const getNames = () => axios.get(url)
.then(res => res.data.map(o => o.name).sort((a, b) => a.localeCompare(b)))
getNames().then(sortedNames => console.info(sortedNames))
<script src = "https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
Очень подробное объяснение, спасибо @charlietfl. Поправьте меня, если я ошибаюсь, но отображение существующего массива всегда лучше, чем манипулирование исходным правильно?
map()
возвращает новый массив, поэтому вы вообще не затрагиваете оригинал.
Но
forEach()
ничего не возвращает (возвращаетundefined
)? Вот почему вы не должны его использовать, кстати.