需要JavaScript异步和等待函数的帮助吗
我正在使用JavaScript,特别是NodeJS,但我的异步等待想法不太清楚,这就是我面临一些问题的原因。先看下面的代码:需要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 =>
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中查看此内容