Javascript объект «undefiner». Как вернуть объект с помощью карты и функции Promise.all () - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь l oop через массив функции ParkingSpots и вернуть объект, который содержит объект ParkingSpot плюс еще 2 информации. Поскольку я внутри своего алгоритма, я использую обещание при просмотре заказов на парковку, я не могу использовать фильтр с await / asyn c (потому что он возвращает обещание), поэтому я использую функцию карты.

var results =  await Promise.all(firstFilteredParkingSpots
            .map((parkingSpot) => coveringPartially(reqStartDate, reqEndDate, parkingSpot.startOfAvailability, parkingSpot.endOfAvailability, parkingSpot)));
        results.forEach((result, index) => {
            if ( result !== null )  {
                console.log(result)
                alternativeRequests.push(firstFilteredParkingSpots[index]);
            }
        });
        if (alternativeRequests.length > 0) {
            return res.status(200).json({
                alternativeRequests: alternativeRequests
            });
        }

        return res.status(404).json({
            message: "No available alternative requests for requested period"
        });

Это моя функция прикрытия Частично:

module.exports = async function coveringPartially(reqStartDate, reqEndDate, startOfAvailOfParkingSpot, endOfAvailOfParkingSpot, parkingSpot) {
    var parkingSpotBookings =  await Booking.find({ parkingSpotId: parkingSpot._id})
    if (parkingSpotBookings.length == 0) {
        if (reqEndDate > startOfAvailOfParkingSpot && reqEndDate < endOfAvailOfParkingSpot) {
            return {
                parkingSpot: parkingSpot,
                alternativeStartDate: startOfAvailOfParkingSpot,
                alternativeEndDate: reqEndDate
            }
        }
        else if (reqStartDate > startOfAvailOfParkingSpot && reqStartDate < endOfAvailOfParkingSpot) {
            return {
                parkingSpot: parkingSpot,
                alternativeStartDate: reqStartDate,
                alternativeEndDate: endOfAvailOfParkingSpot,
            }
        }
        return null

    }
    let sortedBookings = parkingSpotBookings.sort( (currentBooking, nextBooking) => {
        return nextBooking.startDate - currentBooking.startDate
    })
    sortedBookings.reverse()
    console.log(sortedBookings)
    sortedBookings.forEach((current, index, boookings) => {
       
        if(index < boookings.length - 1) {
            let next = boookings[index + 1]

            if(reqStartDate < next.startDate && reqEndDate > next.startDate ) {
                if( reqStartDate <  current.endDate) {
                    return {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: current.endDate,
                        alternativeEndDate: next.startDate
                    }
                } else {
                    var result= {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: reqStartDate,
                        alternativeEndDate: next.startDate
                    }
                    console.log(result)
                    return result
                }
                
            }
            else if (reqStartDate < current.endDate && reqEndDate > current.endDate) {
                if(reqEndDate < next.startDate) {
                    var result =  {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: current.endDate,
                        alternativeEndDate: reqEndDate
                    }
                    return  result
                } else {
                    return {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: current.endDate,
                        alternativeEndDate: next.startDate
                    }
                }
            }
        }
        return null
    })


}

Когда я вызываю API, алгоритм работает, и внутри покрытия Частично определяется результат нового объекта, но, к сожалению, при возврате в функцию карты он не определен. Вот что я получаю внутри функции:

 parkingSpot:
   { isAvailable: true,
     _id: 5ecaefee7ab072208be280dd,
     number: 'SpitalColtea',
     userId: 5ec93159116b25ae0106aeb9,
     address: 'asdmasdsa',
     latitude: 44.434334,
     longitude: 26.103619,
     notes: 'String',
     endOfAvailability: 2020-07-11T08:00:00.410Z,
     startOfAvailability: 2020-07-11T20:00:00.410Z },
  alternativeStartDate: 2020-07-11T14:15:00.410Z,
  alternativeEndDate: 2020-07-11T15:00:00.410Z }

Но после выполнения карты я не могу получить объект, и когда я пытаюсь напечатать на консоли, я получаю «undefined». Не могли бы вы мне помочь с этим вопросом?

1 Ответ

0 голосов
/ 11 июля 2020

У вас есть return внутри обратного вызова .forEach. Это просто вернется из вашего обратного вызова, а не из внешней функции. Таким образом, в конце, когда все итерации выполнены, ваши внешние функции обычно возвращаются без возвращаемого значения, поэтому вы получаете undefined.

. Проще всего будет заменить .forEach обычным for :

    for (const [index, current] of sortedBookings.entries()) {
        if(index < sortedBookings.length - 1) {
            let next = sortedBookings[index + 1]

            if(reqStartDate < next.startDate && reqEndDate > next.startDate ) {
                if( reqStartDate <  current.endDate) {
                    return {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: current.endDate,
                        alternativeEndDate: next.startDate
                    }
                } else {
                    var result= {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: reqStartDate,
                        alternativeEndDate: next.startDate
                    }
                    console.log(result)
                    return result
                }
                
            }
            else if (reqStartDate < current.endDate && reqEndDate > current.endDate) {
                if(reqEndDate < next.startDate) {
                    var result =  {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: current.endDate,
                        alternativeEndDate: reqEndDate
                    }
                    return  result
                } else {
                    return {
                        parkingSpot: parkingSpot,
                        alternativeStartDate: current.endDate,
                        alternativeEndDate: next.startDate
                    }
                }
            }
        }
        return null
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...