Обещание javascript во вложенном цикле

Я безуспешно пытаюсь пройтись по массиву, который имеет массив в качестве одного из параметров, мне нужно пройтись по этому вложенному массиву, чтобы отобразить его в соответствии со спецификациями, затем мне нужно запустить функцию после завершения родительского цикла. Может ли кто-нибудь указать на мою ошибку при выполнении этого?

const schedule = {}
data.schedule.forEach(item => {
  let date = moment(item.date).format('YYYY-MM-DD')
  let eventList = []
  item.events.forEach(event => {
    let start = moment(event.start).format('h:mm A')
    let end = moment(event.end).format('h:mm A')
    let time = `${start} - ${end}`
    eventList.push({time: time, name: event.name})
  })
  return Promise.all(eventList).then(list => {
    console.log('list', list)
    schedule[`${date}`] = list
  })
})

// this is my issue:

Promise.all(schedule).then(list => {
  console.log('schedule:', list)
})

// which bombs the method with:
// TypeError: (var)[Symbol.iterator] is not a function
// at Function.all (native)

Мне действительно нужно вернуть объект, похожий на этот:

{'2017-12-06': [
  {time: '9am - 10am', name: 'Jackson Home'},
  {time: '11AM - 3PM', name: 'Jackson Home'},
  {time: '3PM - 8PM', name: 'Jackson Home'}
]}

person studiobrain    schedule 23.01.2018    source источник
comment
schedule является объектом и не может быть повторен. См. этот пост или этот пост.   -  person Goodbye StackExchange    schedule 24.01.2018
comment
Вам не нужны обещания для того, что показано .... ни одно из них не является асинхронным. Предоставьте некоторые образцы входных данных   -  person charlietfl    schedule 24.01.2018
comment
Я только что прочитал о массиве, необходимом в промисе, что имеет смысл.   -  person studiobrain    schedule 24.01.2018
comment
Promise.all нужен массив, но нужен ли вашему массиву Promise.all? Ответ - нет.   -  person trincot    schedule 24.01.2018


Ответы (2)


Да, я идиот, и мне нужно сделать перерыв на выпивку:

const schedule = {}

  data.schedule.forEach(item => {
    let date = moment(item.date).format('YYYY-MM-DD')
    let eventList = []
    schedule[`${date}`] = item.events.map(event => {
      let start = moment(event.start).format('h:mm A')
      let end = moment(event.end).format('h:mm A')
      let time = `${start} - ${end}`
      return {time: time, name: event.name}
    })
  })

  console.log('schedule:', schedule)
person studiobrain    schedule 23.01.2018

Как сказал @charlietfl, ваш код не асинхронный, поэтому вам не нужен Promise.

Этот код делает то, что вам нужно:

const schedule = {}
data.schedule.forEach(item => {
  let date = moment(item.date).format('YYYY-MM-DD')
  let eventList = []
  item.events.forEach(event => {
    let start = moment(event.start).format('h:mm A')
    let end = moment(event.end).format('h:mm A')
    let time = `${start} - ${end}`
    eventList.push({time: time, name: event.name})
  })

  schedule[`${date}`] = eventList
})

Для этого ввода:

{
    schedule: [
        {
            date: '2017-01-01',
            events: [
                {
                    name: 'test',
                    start: '2017-01-01 10:00:00',
                    end: '2017-01-01 11:00:00'
                }
            ]
        }
    ]
}

... вы получаете это:

{
    "2017-01-01": [
        {
            "time": "10:00 AM - 11:00 AM",
            "name": "test"
        }
    ]
}
person Thiago Barcala    schedule 23.01.2018