Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要JavaScript异步和等待函数的帮助吗_Javascript_Node.js_Async Await - Fatal编程技术网

需要JavaScript异步和等待函数的帮助吗

需要JavaScript异步和等待函数的帮助吗,javascript,node.js,async-await,Javascript,Node.js,Async Await,我正在使用JavaScript,特别是NodeJS,但我的异步等待想法不太清楚,这就是我面临一些问题的原因。先看下面的代码: exports.scheduleDates = (req, res) => { let currentTime = moment().format('YYYY/MM/DD') Schedules.findAll({ attributes: ['disable_dates_array'], }).then(result =>

我正在使用JavaScript,特别是NodeJS,但我的异步等待想法不太清楚,这就是我面临一些问题的原因。先看下面的代码:

exports.scheduleDates = (req, res) => {
    let currentTime = moment().format('YYYY/MM/DD')
    Schedules.findAll({
        attributes: ['disable_dates_array'],
    }).then(result => {
        let firstDay, secondDay
        let disableDates = JSON.stringify(result).substring(25, JSON.stringify(result).length - 3).split(',')

        let i = 0, found = false, addDay = 1
        function getFirstAvailableDay() {
            disableDates.map(v => {
                i += 1
                if (v == currentTime) {
                    currentTime = moment(new Date()).add(addDay, 'days').format('')
                    addDay += 1
                    i = 0
                    getFirstAvailableDay()
                }

                else if (i == disableDates.length - 1 && found == false) {
                    firstDay = currentTime
                }
            })
        }
        getFirstAvailableDay()
        let secDay = moment(new Date()).add(addDay, 'days').format('YYYY/MM/DD'); i = 0
        function getSecondAvailableDay() {
            disableDates.map(v => {
                i += 1
                if (v == secDay) {
                    secDay = moment(new Date()).add(addDay, 'days').format('YYYY/MM/DD')
                    sec += 1
                    i = 0
                    getSecondAvailableDay()
                }

                else if (i == disableDates.length - 1 && found == false) {
                    secondDay = secDay
                }
            })
        }

        getSecondAvailableDay()
        let fd = firstDay.replace(/\//g, '-'); let sd = secondDay.replace(/\//g, '-');
        firstDay = fd, secondDay = sd
        let response = {
            available_days: [
                firstDay,
                secondDay
            ],
        }

        sequelize
            .query("SELECT favourite_routes.passenger_id AS 'passenger_id', favourite_routes.route_id AS 'route_id', routes.trip_price as 'ticket_price', points.id as 'pick_up_point_id', points.name as 'pick_up_point_name', drop_off.id as drop_off_point_id, drop_off.name as 'drop_of_point_name', locations.id as 'pick_up_location_id', locations.name as 'pick_up_location_name', drop_off_location.id as 'drop_off_location_id', drop_off_location.name as 'drop_off_location_name' FROM ( favourite_routes LEFT JOIN points ON favourite_routes.pick_up_id = points.id LEFT JOIN points as drop_off ON favourite_routes.drop_of_id = drop_off.id LEFT JOIN routes ON favourite_routes.route_id = routes.id left JOIN locations ON points.location_id = locations.id LEFT JOIN locations as drop_off_location on drop_off.location_id = drop_off_location.id ) WHERE (favourite_routes.passenger_id = 14926)GROUP BY favourite_routes.id")
            .then(data => {
                response.favourite_route = data[0][0]
                let i = 0, times = [];
                response.available_days.map(day => {
                    sequelize.query(`SELECT DISTINCT times.time, times.id FROM bus_time_dates LEFT JOIN bus_times ON bus_time_dates.bus_time_id = bus_times.id LEFT JOIN locations ON bus_times.location_id = locations.id LEFT JOIN times ON bus_times.time_id = times.id WHERE bus_time_dates.date = '${day}' AND bus_times.location_id = ${response.favourite_route.pick_up_location_id}`).then(data => {
                        let date = {
                            date: day,
                            times: data[0]
                        }
                        times.push(date)
                    })
                })
                setTimeout(() => {
                    response.times = times
                    res.status(201).json({
                        "status": true,
                        "code": 200,
                        "message": "Success",
                        "data": response
                    })
                }, 5)
            })
    })
}
在这个控制器文件中,有几个基于DB查询的部分,一个部分依赖于另一个部分

当我要给出响应时,我必须等待一段时间,因为获取查询结果需要一些时间。但是使用异步会更准确


如何使用async and await函数重写完整的控制器文件?

正如您要求的那样,转换了下面的承诺。但这只是承诺的替代品。您不必重新编写代码,但无论如何,既然您说要重新编写,请在下面找到async Wait版本

exports.scheduleDates = async (req, res) => {
    let currentTime = moment().format('YYYY/MM/DD')
    try{
        let result = await Schedules.findAll({
            attributes: ['disable_dates_array'],
        });
        let firstDay, secondDay
        let disableDates = JSON.stringify(result).substring(25, JSON.stringify(result).length - 3).split(',')

        let i = 0, found = false, addDay = 1
        function getFirstAvailableDay() {
            disableDates.map(v => {
                i += 1
                if (v == currentTime) {
                    currentTime = moment(new Date()).add(addDay, 'days').format('')
                    addDay += 1
                    i = 0
                    getFirstAvailableDay()
                }

                else if (i == disableDates.length - 1 && found == false) {
                    firstDay = currentTime
                }
            })
        }
        getFirstAvailableDay()
        let secDay = moment(new Date()).add(addDay, 'days').format('YYYY/MM/DD'); i = 0
        function getSecondAvailableDay() {
            disableDates.map(v => {
                i += 1
                if (v == secDay) {
                    secDay = moment(new Date()).add(addDay, 'days').format('YYYY/MM/DD')
                    sec += 1
                    i = 0
                    getSecondAvailableDay()
                }

                else if (i == disableDates.length - 1 && found == false) {
                    secondDay = secDay
                }
            })
        }

        getSecondAvailableDay()
        let fd = firstDay.replace(/\//g, '-'); let sd = secondDay.replace(/\//g, '-');
        firstDay = fd, secondDay = sd
        let response = {
            available_days: [
                firstDay,
                secondDay
            ],
        }

        let data = await sequelize .query("SELECT favourite_routes.passenger_id AS 'passenger_id', favourite_routes.route_id AS 'route_id', routes.trip_price as 'ticket_price', points.id as 'pick_up_point_id', points.name as 'pick_up_point_name', drop_off.id as drop_off_point_id, drop_off.name as 'drop_of_point_name', locations.id as 'pick_up_location_id', locations.name as 'pick_up_location_name', drop_off_location.id as 'drop_off_location_id', drop_off_location.name as 'drop_off_location_name' FROM ( favourite_routes LEFT JOIN points ON favourite_routes.pick_up_id = points.id LEFT JOIN points as drop_off ON favourite_routes.drop_of_id = drop_off.id LEFT JOIN routes ON favourite_routes.route_id = routes.id left JOIN locations ON points.location_id = locations.id LEFT JOIN locations as drop_off_location on drop_off.location_id = drop_off_location.id ) WHERE (favourite_routes.passenger_id = 14926)GROUP BY favourite_routes.id")
        response.favourite_route = data[0][0]
        let i = 0, times = [];
        response.available_days.map(day => {
            sequelize.query(`SELECT DISTINCT times.time, times.id FROM bus_time_dates LEFT JOIN bus_times ON bus_time_dates.bus_time_id = bus_times.id LEFT JOIN locations ON bus_times.location_id = locations.id LEFT JOIN times ON bus_times.time_id = times.id WHERE bus_time_dates.date = '${day}' AND bus_times.location_id = ${response.favourite_route.pick_up_location_id}`).then(data => {
                let date = {
                    date: day,
                    times: data[0]
                }
                times.push(date)
            })
        })
        response.times = times
        res.status(201).json({
            "status": true,
            "code": 200,
            "message": "Success",
            "data": response
        })
    }catch(error){
        //console.log(error)
    }
}

Async await只是一种语法糖,可以替代promise语法。你不一定需要重构它,但如果你想重构的话,谷歌上有很多文章可以为你指明正确的方向。您也可以在thansk..@vatz88中查看此内容