发起同步的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: '时间参数缺失'
        })
    }
})