Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.01.2018, 01:29
Новичок на форуме
Отправить личное сообщение для serfer89 Посмотреть профиль Найти все сообщения от serfer89
 
Регистрация: 30.01.2018
Сообщений: 1

Помощь с асинхронностью
Всем привет!
Написал небольшой скрипт который выбирает лучшие места в зале кинотеатра. Проверяю в консоле все ок, а вот вывести переменную наружу не могу, запутался окончательно.

Кто то может подсказать, как сделать так что бы при вызове bestSeats(theatreid, showtimeid, count) с необходимыми параметрами и получить в ответ что типа 300004,300005,300006

Понимаю что нужно использовать async await, но не могу понять как их тут применить.

var bestSeats = function(theatreid, showtimeid, count) {
  var request = require("request-promise");
  var data1;
  var uniq_row = [];
  var arr_row = [];
  var arr_seat = [];
  var best_row;
  var best_seat;
  var full_schem = [];
  var full_length;


  var loginArgs = {
    headers: {
      "Content-Type": "application/json",
      "Image-Scale": "2"
    }
  };

  request(
    "http://.../halls?showTimeid=" + showtimeid
  ) // получаем список занятых/свободых мест
    .then(function(data) {
      data1 = JSON.parse(data);

      return request(
        "http://.../geometricsHallSheme?theaterId=" +
          theatreid,
        loginArgs
      ); // получаем список всех мест в зале
    })
    .then(function(data) {
      data2 = JSON.parse(data);
      try {
        for (var i = 0; i < data2.data.geometricsHallSheme.length; i++) {
          if (
            data2.data.geometricsHallSheme[i].hallid ==
            data1.data.hallsSheme[0].hallId
          ) {
            for (
              var x = 0;
              x < data2.data.geometricsHallSheme[i].seats.length;
              x++
            ) {
              full_schem.push(data2.data.geometricsHallSheme[i].seats[x].id);
              arr_row.push(data2.data.geometricsHallSheme[i].seats[x].row);

              uniq_row = Array.from(new Set(arr_row));
              uniq_row.sort(function(a, b) {
                return a - b;
              });
              best_row = Math.max(...uniq_row) / 2 - 1;
              best_row = uniq_row[parseFloat(best_row.toFixed(0))];

              if (data2.data.geometricsHallSheme[i].seats[x].row == best_row) {
                arr_seat.push(data2.data.geometricsHallSheme[i].seats[x].seat);
              }
            }

            //console.log( arr_seat);
            uniq_seat = Array.from(new Set(arr_seat));
            uniq_seat.sort(function(a, b) {
              return a - b;
            });
            best_seat = Math.max(...uniq_seat) / 2 - 1;
            best_seat = uniq_seat[parseFloat(best_seat.toFixed(0))];
            console.log(
              "uniq seats- " + uniq_seat.length + " best_seat " + best_seat
            );

            console.log(best_row);
            console.log(
              "uniq rows- " + uniq_row.length + " best_row " + best_row
            );

            full_length = data2.data.geometricsHallSheme[i].seats.length;
          }
        }
      } catch (err) {
        console.log(err);
      }
      try {
        if (data1.data.hallsSheme[0].busySeats != null) {
          Array.prototype.diff = function(a) {
            return this.filter(function(i) {
              return a.indexOf(i) < 0;
            });
          };

          var result_ar = full_schem.diff(data1.data.hallsSheme[0].busySeats);
        } else var result_ar = full_schem.diff(data1.data.hallsSheme[0].emptySeats);

        console.log(
          "Hall ID",
          data1.data.hallsSheme[0].hallId,
          "Full shema",
          result_ar.length
        );

      } catch (err) {
        console.log(err);
      }

      get_places(full_schem);

      console.log("best_row=" + typeof best_row);


      
      var re2 = new RegExp("^[a-zA-Z].*$"); // ряды могут как буквами так и цифрами
      re2 = re2.test(best_row);
      if (re2 == false) {
        best_row = parseInt(best_row);
        var best_row_arr = [best_row];

        for (var x = 1; x < 4; x++) {
          if (best_row - x > 0) {
            best_row_arr.push(best_row - x);
          }
          best_row_arr.push(best_row + x);

        }
        console.log(best_row_arr);

        var ar1 = [];
        for (var i = 0; i < fn_seat.length; i++) {


          if (fn_seat[i].row == best_row_arr[x]) {
            ar1.push(fn_seat[i].seat);


          }
        }

        get_places(result_ar);

        for (var x = 0; x < best_row_arr.length; x++) {
          var ar = [];
          for (var i = 0; i < fn_seat.length; i++) {


            if (fn_seat[i].row == best_row_arr[x]) {
              ar.push(fn_seat[i].seat);


            }
          }

          var closer = getClosestNum(Math.max(...ar) / 2, ar); // ищем ближайшее число к центру

          console.log(
            "row " + best_row_arr[x] + " closer = " + closer + " x = " + ar
          );
          if (count % 2 == true) {
            var xl = (count - 1) / 2;
            var xp = xl;
          } else {
            var xl = parseInt(((count - 1) / 2).toFixed(0));
            var xp = parseInt(count - xl - 1);
          }
          var tikets = [];

          var start = parseInt(ar.indexOf(closer) - xp);
          var finish = parseInt(ar.indexOf(closer)) + xl + 1;
          for (y = start; y < finish; y++) {
            if (Math.abs(ar[y] - ar[y - 1]) == 1) {
              if (ar[y] > 9) {
                tikets.push(best_row_arr[x] + "000" + ar[y]);
              }
              if (ar[y] < 10) {
                tikets.push(best_row_arr[x] + "0000" + ar[y]);
              }


            } else {
              console.log(ar[y] - ar[y - 1]);
            }
          }
          if (tikets.length == count) {
            console.log("ok" + tikets);
            

            return tikets;
          }
        }
      } else {
        
        best_row_arr = ["B", "C", "D", "A"];

        var ar1 = [];
        for (var i = 0; i < fn_seat.length; i++) {


          if (fn_seat[i].row == best_row_arr[x]) {
            ar1.push(fn_seat[i].seat);


          }
        }

        get_places(result_ar);

        for (var x = 0; x < best_row_arr.length; x++) {
          var ar = [];
          for (var i = 0; i < fn_seat.length; i++) {


            if (fn_seat[i].row == best_row_arr[x]) {
              ar.push(fn_seat[i].seat);

seat);
            }
          }

          var closer = getClosestNum(Math.max(...ar) / 2, ar);
                    if (closer % 2 == false) {closer+1}


          console.log(
            "row " + best_row_arr[x] + " closer = " + closer + " x = " + ar
          );
          if (count % 2 == true) {
            var xl = (count - 1) / 2;
            var xp = xl;
          } else {
            var xl = parseInt(((count - 1) / 2).toFixed(0));
            var xp = parseInt(count - xl - 1);
          }
          var tikets = [];

          var start = parseInt(ar.indexOf(closer) - xp);
          var finish = parseInt(ar.indexOf(closer)) + xl + 1;
          //console.log(typeof(xl));
          for (y = start; y < finish; y++) {
            //console.log(y);
            if (Math.abs(ar[y] - ar[y - 1]) == 1) {
              tikets.push(best_row_arr[x] + "0000" + ar[y]);
            } else {
              console.log(ar[y] - ar[y - 1]);
            }
          }
          if (tikets.length == count) {
            console.log("ok" + tikets);

            return tikets; // то что нужно в итоге
          }
        }
      }
    });
};

Последний раз редактировалось serfer89, 30.01.2018 в 01:36.
Ответить с цитированием
  #2 (permalink)  
Старый 30.01.2018, 08:34
Профессор
Отправить личное сообщение для Audaxviator Посмотреть профиль Найти все сообщения от Audaxviator
 
Регистрация: 28.04.2017
Сообщений: 214

Куда "наружу"?
Ни callback-функции, ни промисы, ни "промисифицированные функции", ни async-функции не умеют возвращать (return) "наружу" значения (только "промис в ожидании" в последних двух случаях). Это главный момент, который нужно иметь в виду про "асинхронность".

Последний раз редактировалось Audaxviator, 30.01.2018 в 15:32.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Требуется помощь с прошивкой баннеров HTML5 Canvas kambodge Работа 0 08.07.2016 13:55
помощь по jquerry анимации rev27 Элементы интерфейса 6 23.04.2014 02:06
Нужна помощь по javascript darklend Общие вопросы Javascript 0 12.01.2014 21:33
Требуется помощь bboulevard Ваши сайты и скрипты 14 02.12.2013 15:47
Нужна помощь: Slider wheel Alex555 Мобильный JavaScript 0 15.05.2013 17:06