Как вернуть значение при связывании после цикла массива внутри обещания и передать его следующему обещанию в качестве аргумента?

Я пытаюсь получить данные с конечной точки. Тем не менее, все работает нормально, за исключением крошечной ошибки, которую, как мне кажется, я делаю, но я не очень хорошо осведомлен об этой конкретной структуре.

Я использую 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) )

Но forEach() ничего не возвращает (возвращает undefined)? Вот почему вы не должны его использовать, кстати.

Bergi 27.10.2018 14:22

Это ваш настоящий код? Ни .then( r => r ), ни .then( r => r.map( v => v ) ), ни .then( r => {const n = r; return n} ) не имеют никакого смысла.

Bergi 27.10.2018 14:23

Берги, проблема здесь не в том, как назвать моего друга.

Evangelos 27.10.2018 14:24

И да, это фактический код, который я пишу.

Evangelos 27.10.2018 14:25

Для чего именно вы собираетесь использовать forEach? Также у вас гораздо больше then(), чем нужно

charlietfl 27.10.2018 14:26

Конечная точка (jsonplaceholder.typicode.com/users) возвращает массив с объектами, и каждый объект имеет такие свойства, как имя, фамилия и т. д. Ну, я пытаюсь, например, получить имена и управлять ими в другом .then ().

Evangelos 27.10.2018 14:27

Сделайте это на своем map(), который в настоящее время бесполезен и избыточен.

charlietfl 27.10.2018 14:30

так что такая цепочка не поможет! Я пытался реализовать это так, чтобы писать чистый код! Также с точки зрения производительности не станет лучше?

Evangelos 27.10.2018 14:32

Большая часть показанной цепочки не имеет смысла и представляет собой не что иное, как бесполезное раздувание кода.

charlietfl 27.10.2018 14:33

@evangelos Они не имеют смысла не потому, что их имена не имеют смысла, а потому, что все эти обратные вызовы ничего не делают. Они производят точно такое же значение результата, которое им было введено. Отбросьте их, и ваш код будет работать так же.

Bergi 27.10.2018 14:51

@charlietfl и Bergi спасибо за ваши ответы, друзья мои! Кроме того, я обновил код. Не могли бы вы сообщить мне, верен ли этот подход?

Evangelos 27.10.2018 15:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
11
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если все, что вам нужно, это массив имен из объектов ответа, вы слишком усложняете все это с помощью бесполезного 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. Поправьте меня, если я ошибаюсь, но отображение существующего массива всегда лучше, чем манипулирование исходным правильно?

Evangelos 27.10.2018 16:24

map() возвращает новый массив, поэтому вы вообще не затрагиваете оригинал.

charlietfl 27.10.2018 16:26

Другие вопросы по теме