Всем привет!
Написал небольшой скрипт который выбирает лучшие места в зале кинотеатра. Проверяю в консоле все ок, а вот вывести переменную наружу не могу, запутался окончательно.
Кто то может подсказать, как сделать так что бы при вызове 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; // то что нужно в итоге
}
}
}
});
};