Promise.resolve с массивами - PullRequest
0 голосов
/ 09 мая 2019

У меня есть следующий код. Его цель - взять данные из базы данных и отформатировать их в объекты JSON, чтобы они могли быть совместимы с VueCal.

Я запрашиваю данные из базы данных, затем беру каждый результат и создаю объект JSON, помещаю этот объект в массив, затем использую Promise.resolve([array name]), чтобы, надеюсь, вернуть этот массив с обещанием.

Я обертываю это в блок Promise.all и затем добавляю все эти разрешенные обещания в другой массив. Этот окончательный массив содержит 4 неопределенных элемента. Почему это?

try {
    const results = await Promise.all([
      Budget.find({
        userEmail: req.body.userEmail
      })
        .then(budgets => {
          let budgetsFormatted = []
          for (let i = 0; i < budgets.length; i++) {
            if (budgets[i].startDate) {
              var startBegin = moment(budgets[i].startDate, 'YYYY-MM-DD HH:mm')
              var endBegin = moment(budgets[i].startDate, 'YYYY-MM-DD HH:mm').add(1, 'hour')
              var startEnd = moment(budgets[i].startDate, 'YYYY-MM-DD HH:mm').add(budgets[i].duration, 'days')
              var endEnd = moment(budgets[i].startDate, 'YYYY-MM-DD HH:mm').add(1, 'hour')
            } else {
              continue
            }
            budgetsFormatted.push({
              title: budgets[i].title,
              start: startBegin,
              end: endBegin,
              content: octicons.credit_card + '<br>£' + budgets[i].amount
            })
            budgetsFormatted.push({
              title: budgets[i].title,
              start: startEnd,
              end: endEnd,
              content: octicons.credit_card + '<br>£' + budgets[i].amount
            })
          }
          console.log(budgetsFormatted)
          Promise.resolve(budgetsFormatted)
        })
        .catch(err => {
          Promise.reject(err)
        }),

      Notes.find({
        userEmail: req.body.userEmail
      })
        .then(notes => {
          let notesFormatted = []
          for (let i = 0; i < notes.length; i++) {
            if (notes[i].dateCreated) {
              var start = moment(notes[i].dateCreated, 'YYYY-MM-DD HH:mm')
              var end = moment(notes[i].dateCreated, 'YYYY-MM-DD HH:mm').add(1, 'hour')
            } else {
              continue
            }
            notesFormatted.push({
              title: notes[i].title,
              start: start,
              end: end,
              content: octicons.note + '<br>' + notes[i].body.substr(1, 10) + '...'
            })
          }
          console.log(notesFormatted)
          Promise.resolve(notesFormatted)
        })
        .catch(err => {
          Promise.reject(err)
        }),

      StudyPlan.find({
        userEmail: req.body.userEmail
      })
        .then(studyplan => {
          let studyPlansFormatted = []
          for (let i = 0; i < studyplan.length; i++) {
            for (let j = 0; j < studyplan[i]['daysAndTimes'].length; j++) {
              if (studyplan[i]['daysAndTimes'].timeFrom) {
                var start = moment(studyplan[i]['daysAndTimes'].timeFrom, 'YYYY-MM-DD HH:mm')
                var end = moment(studyplan[i]['daysAndTimes'].timeFrom, 'YYYY-MM-DD HH:mm').add(studyplan[i]['daysAndTimes'].duration, 'hours')
              } else {
                continue
              }
              studyPlansFormatted.push({
                title: studyplan[i].title,
                start: start,
                end: end,
                content: octicons.pencil
              })
            }
          }
          console.log(studyPlansFormatted)
          Promise.resolve(studyPlansFormatted)
        })
        .catch(err => {
          Promise.reject(err)
        }),

      TodoList.find({
        userEmail: req.body.userEmail
      })
        .then(todolists => {
          let todoListsFormatted = []
          for (let i = 0; i < todolists.length; i++) {
            if (todolists[i].dateDue) {
              var start = moment(todolists[i].dateDue, 'YYYY-MM-DD HH:mm')
              var end = moment(todolists[i].dateDue, 'YYYY-MM-DD HH:mm').add(1, 'hours')
            } else {
              continue
            }

            todoListsFormatted.push({
              title: todolists[i].title,
              start: start,
              end: end,
              content: octicons.tasklist
            })
          }
          console.log(todoListsFormatted)
          Promise.resolve(todoListsFormatted)
        })
        .catch(err => {
          Promise.reject(err)
        })
    ])

    const events = [].concat.apply([], results)

EDIT:

Я оставлю код там, если кто-нибудь захочет его посмотреть. Но это основная структура кода:

const results = await Promise.all([
  //Find data in Database
  |
   ->  //Format result to be a JSON object like the following:
        {
          title: 'Event Title',
          start: //Start date of event,
          end: //End date of event,
          content: '<content> of event object in </calendar>'
        }
        //Add this object into array
        Promise.resolve(the above referenced array)

  //Repeat the above for each collection in the database

])

const events = [].concat.apply([], results)

1 Ответ

2 голосов
/ 09 мая 2019

Вы забыли вернуть результат в каждом обработчике Promise.Вот почему элементы в результатах не определены

return Promise.resolve(budgetsFormatted)
...