本文介绍在Node.js Express框架中,如何利用axios结合async/await语法实现看似同步的请求流程。通过封装Promise对象并在控制器中调用,配合前端setTimeout延迟刷新,解决特定场景下需要等待接口返回结果后再更新页面的需求。
axios同步请求的实现思路
axios通常用于处理异步请求,但在某些特殊场景下,开发者可能需要实现同步请求的效果。那么该如何实现呢?
首先,需要定义一个名为syncAxios的方法。
封装syncAxios方法
let axios = require('axios');
exports.syncAxios = function (obj = {}) {
let url = "http://www.rrbay.com/api/";
return new Promise((resolve, reject) => {
axios(url, {
method: 'POST',
timeout: 5000,
params: {
sProcName: obj.sProcName,
idNo: obj.id,
userName: obj.qq,
overTime: obj.endTime
}
}).then((res) => {
resolve(res.data);
}).catch((error) => {
reject(error)
})
})
};接着,在Express的控制器中进行调用。
控制器中的调用示例
exports.check = function (req, res) {
//定义async方法体
XXXMode.findById(id).populate('author').exec(async function (err, result) {
let dataCode = false;
if(result.status ==0){
//同步调用
await baseapi.syncAxios({
sProcName: 'Update',
id: '000000-1111-2222-3333-9999999',
qq: '391502069',//result.author.name,
endTime: '2022/12/31 11:39:05'//result.EndTime
}).then((data) => {
console.log(data, 'res');
}).catch((err) => {
console.log(err && err.stack);
});
}
result.save(function (err, onewxtob) {
if (req.xhr) {
return res.json({
status: !err
})
}
});
});
};
在前端视图层使用Jade模板引擎时,需要在请求check之后,通过延迟刷新页面来显示请求结果。
前端延迟刷新处理
setTimeout(function () {
$(location).attr('href',window.location.href)
}, 1000)这里利用setTimeout实现了页面的延迟加载与刷新效果。结合控制器的交互逻辑,最终达成了同步操作的效果。