javascript - 需要有关 JavaScript 异步和等待功能的帮助
问题描述
我正在使用 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 函数重写完整的控制器文件?
解决方案
正如你所问的那样,转换了下面的 Promise。但它只是 Promises 的替代品。您不必重新编写代码,但无论如何,既然您说要重新编写,请在下面找到异步等待版本。
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)
}
}
推荐阅读
- arrays - 编写代码以从用户那里获取字符串输入,然后在一行上打印除字符串的第一个和最后一个字母之外的所有字符
- python - 传递参数和使用它之间有什么错误?
- java - 无法使用 POST 方法执行重定向
- docker - 在 minikube 上使用本地图像
- django - 当参数错误时,django-filter 返回空查询集
- avr-gcc - 在 avr-gcc 编译器上进行位移时是否存在错误?
- html - 有没有办法让 div 用纯 CSS 飞入/飞出
- tableau-api - Tableau :找出一个产品的销售额与所有产品的季度变化比率
- pandas - XLRDError:不支持的格式或损坏的文件
- flutter - 当像 YouTube 一样被点击时,如何让我的底部导航栏一直向上?