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

1

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

Я использую 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.log(e.response.status) : console.log(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.log(names.sort( (a, b) => b-a) )

  }
)

/* Error handling */
.catch( e => e.respose ? console.log(e.response.status) : console.log(e.message) )
  • 2
    Но forEach() ничего не возвращает (возвращает undefined )? Вот почему вы не должны использовать его, кстати.
  • 1
    Это ваш настоящий код? Ни .then( r => r ) , .then( r => r.map( v => v ) ) ни .then( r => {const n = r; return n} ) имеют смысла.
Показать ещё 9 комментариев
Теги:
foreach
es6-promise

1 ответ

3
Лучший ответ

Если все, что вы хотите, представляет собой массив имен из объектов ответа, вы чрезмерное сокрушаете все это с помощью бесполезных 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.log(sortedNames))
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
  • 0
    Очень подробное объяснение спасибо @charlietfl. Поправьте меня, если я ошибаюсь, но отображение существующего массива всегда лучше, чем манипулирование исходным правом?
  • 1
    Ну, map() возвращает новый массив, так что вы не влияете на оригинал

Ещё вопросы

Сообщество Overcoder
Наверх
Меню