方法肥皂中的promise.all问题,仅返回第一个查询API

时间:2019-03-25 16:25:08

标签: node.js for-loop soap promise async-await

我正在使用api肥皂,但是在运行该函数时仅从for获得第一个结果,为什么不是所有查询都正确完成或正确完成?

我尝试过使用函数promise,然后在async / await函数中调用该函数,但这不起作用

  const moment = require("moment");
  const soap = require('soap');
  module.exports = {
  getData: function (params) {
    var StationId = params.StationId;
    var session = JSON.parse(params.session);
    console.log("MALL ",StationId);
    var promises = [];
    var sippCodes = [
    {sippcode: "EDMR", category:'Economico'},
    {sippcode: "CDMR", category:'Compacto'},
    {sippcode: "CDAR", category:'Compacto'},
    {sippcode: "IDMR", category:'Intermedio'},
    {sippcode: "IDAR", category:'Intermedio'},
    {sippcode: "IFAR", category:'Suv'},
    {sippcode: "SDMR", category:'Estandar'},
    {sippcode: "SDAR", category:'Estandar'},
    {sippcode: "FDAR", category:'Fullsize'}
    ];
    // for(var m in malls) {
      // promises.push(new Promise(function (resolve, reject) {
        return new Promise(function (resolve, reject) {
          const url = ''http://172.30.8.100:4000/SOAP?service=isCarRental_BookingInterface_Service';
          var args = {
            SessionId: session.SessionId,
            CheckOutStationId:StationId,
                CheckOutDate:moment(params.datetime[0]).format('YYYY-MM-DDThh:mm:ss'),//'2019-03-10T10:00:00',//
                CheckInStationId:StationId,
                CheckInDate:moment(params.datetime[1]).format('YYYY-MM-DDThh:mm:ss'),//'2019-03-11T10:00:00',//
                Currency: "MXN",
                WaiverPlan: "BASIC",
                Waivers:[],
                Extras:[],
                DealId:0,
                BookingNumber:0
              };
              var vehicles = [];
              soap.createClient(url, function(err, client) {
                client.GetCarAvailability2(args, function(err, result) {
                  if(result.Result && result.Result.AvailableCarList){
                    var avail = result.Result.AvailableCarList;
                    for(var i in avail.TICarWp){
                      if(avail.TICarWp[i].BookId){
                       var sippcode = avail.TICarWp[i].Group.SippCode.$value;
                       var category = avail.TICarWp[i].Group.Category.$value
                       var res = sippCodes.filter( item => item.sippcode == sippcode);
                       if(res.length > 0){
                        category = res[0].category
                      }
                      var vehicle = {
                        name : avail.TICarWp[i].Group.CarModel.$value,
                        price : avail.TICarWp[i].CarValuation.Total.$value,
                        currency : "MXN",
                        category : category
                      }
                      vehicles.push(vehicle);
                    }else{
                      console.log("no encuentra el carro");
                    }
                  }
                  resolve(vehicles);
                }
              });
              });

            });
      }
    }
      function getData()
        for(var i in malls){
          var mall = malls[i];
          var params = {
            datetime: vm.datetime,
            StationId: mall.StationId,
            session: vm.session
          };
          const res = await vm.getDataPromise(params);
        }
      }

      getDataPromise(params){
        new Promise(function(resolve, reject){
          axios.get("/getData", {
            params
          }).then(function (response) {
            // console.log(response);
            resolve(response.data);
          })
          .catch(function (error) {
            reject({
              error: true,
              msg: "Sin datos"
            });
          })
        })
      }

我希望输出
[{data:data},{data:data},{data:data}]
但实际输出是
[{data:true},{},{}]

2 个答案:

答案 0 :(得分:2)

person.title="Title" 
person.surname="Surname" 
person.job.description="Some description"

缺少return语句。您现在隐式返回undefined,而不是现在。

答案 1 :(得分:0)

您的getData函数应像下面那样构建promise数组:

 async function getData()
        var promises = [];
        for(var i in malls){
          var mall = malls[i];
          var params = {
            datetime: vm.datetime,
            StationId: mall.StationId,
            session: vm.session
          };
          promises.push(vm.getDataPromise(params));
        }
        return await Promise.all(promises)
      }

并且您的getDataPromise缺少返回语句,该语句返回使用new创建的实际承诺