发起同步的Post请求
博客简介
在node的express框架下,发起同步执行的post请求,遍历集合发起post请求,想要得到集合下的所有结果并组装数据后,再将结果进行返回,但是axios默认异步请求,无法等待全部结果返回再进行操作,所以就产生了同步请求数据的需求,在此记录
1、解决方案
使用 async
修饰符定义一个异步的方法,然后在 axios
请求前添加 await
关键字,那么即可在 node 环境下将 axios 转为同步执行的请求
2、举个栗子
/**
* 给axios请求加上await关键字,await只可出现再被async修饰的异步方法里,那么请求就会同步执行
* @param {*} token
* @param {*} sTime
* @param {*} eTime
* @param {*} list
* @param {*} callback
*/
async function queryData(token, sTime, eTime, list, callback) {
var resultList = [];
for(var i = 0; i < list.length; i++) {
var rainData = list[i];
var name = rainData.Name;
rainData.code = name.substring(name.indexOf('(')+1, name.length -1);
var eid = rainData.monitorId;
await axios({
method: 'POST',
headers: {
'content-type': 'application/json',
'Authorization': 'Bearer ' + token
},
data: {
"startTime": sTime,
"endTime": eTime
},
url: config.monitorSysUrl + '/xxxxx/api'
}).then(result => {
var resData = result.data;
rainData.rainArr = resData.Data
resultList.push(rainData)
}).catch(function (error) {
console.log(error)
rainData.rainArr = []
resultList.push(rainData)
});
}
callback(resultList)
}
PS:上面的方法,循环每个变量时,会等待返回结果后,再进行下一次循环
3、调用方法
/**
* 获取数据
*/
router.get('/queryRainGaugeData', function (req, res) {
var sTime = req.query.sTime;
var eTime = req.query.eTime;
if(sTime && eTime) {
getToken(function(response) {
var token = response.access_token;
queryRainGaugeList(token, function(list) {
if(list!=null && list.length>0) {
queryData(token, sTime, eTime, list, function(arr) {
res.json({
success: true,
data: arr
})
});
} else {
res.json({
success: true,
data: []
})
}
});
});
} else {
res.json({
success: false,
data: null,
msg: '时间参数缺失'
})
}
})