Задать вопрос

Почему возвращается пустой массив?

почему в моменте не пустой
statesDto.push(stateDto)
а в return он пустой?

async getProjectStates(project_id) {
        const states = await State.findAll({
            where: {
                project_id
            },
            order: [
                ['serial_number', 'ASC']
            ]
        })

        let statesDto = []
        if (states) {
             await states.map(async state => {
                 const tasks = await Task.findAll({
                     where: {
                         state_id: state.id
                     },
                     order: [
                         ['createdAt', 'DESC']
                     ]
                 })

                 let tasksDto = []
                 if (tasks) {
                     tasks.map(task => {
                         const taskDto = new TaskDto(task)
                         tasksDto.push(taskDto)
                     })
                 }

                 const stateDto = new StateDto(state)
                 stateDto.tasks = tasksDto
                 statesDto.push(stateDto)
             })
        }
        return statesDto
    }
  • Вопрос задан
  • 236 просмотров
Подписаться 1 Простой 9 комментариев
Решения вопроса 1
@DeFaNJI
1. await с .map не сработает, пока будет выполняться .map тебе уже вернет пустой массив, что бы этого избежать используй Promise.all(и тут применяй .map)

В твоем случае должно сработать примерно вот так:

async getProjectStates(project_id) {
    const states = await State.findAll({
        where: {
            project_id
        },
        order: [
            ['serial_number', 'ASC']
        ]
    })

    let statesDto = []

    if (states.length) {
        await Promise.all(states.map(async state => {
            const tasks = await Task.findAll({
                where: {
                    state_id: state.id
                },
                order: [
                    ['createdAt', 'DESC']
                ]
            })

            let tasksDto = []

            if (tasks.length) {
                tasks.map(task => {
                    const taskDto = new TaskDto(task)
                    tasksDto.push(taskDto)
                })
            }

            const stateDto = new StateDto(state)

            stateDto.tasks = tasksDto
            
            statesDto.push(stateDto)
        }))
    }

    return statesDto
}

2. Если это mongoose, то в states должен быть массив, а при запросе, который ничего не нашел должен возвращаться пустой массив. Пустой массив в JS все равно будет помечен как true, поэтому уместнее тут было бы делать условие по .length . Точно также с tasks в .map

const arr = []

console.log(Boolean(arr)) // true
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы