Проблема с promise.all в методе мыла, только вернуть первый запрос API - PullRequest
0 голосов
/ 25 марта 2019

Я потребляю API-мыло, но при запуске функция получает только первый результат от for. Почему не все запросы завершаются или завершаются правильно?

Я пробовал с обещанием функции, ивызовите эту функцию в функции 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: true}, {}, {}]

Ответы [ 2 ]

2 голосов
/ 25 марта 2019
      getDataPromise(params){
        new Promise(function(resolve, reject){

отсутствует оператор возврата. Вы неявно возвращаете неопределенное здесь вместо этого сейчас.

0 голосов
/ 25 марта 2019

Ваша функция getData должна построить массив обещаний следующим образом:

 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 отсутствует оператор возврата, который возвращает фактическое обещание, которое вы создаете с новым

...