【发布时间】:2020-02-03 04:40:58
【问题描述】:
我正在使用 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 和 await 函数重写完整的控制器文件?
【问题讨论】:
-
Async await 只是一个语法糖,可以替代 promise 语法。您不一定需要重构它,但如果您愿意,谷歌上有很多文章会为您指明正确的方向。您也可以查看developers.google.com/web/fundamentals/primers/async-functions
-
谢谢..@vatz88
标签: javascript node.js async-await