Помощь с асинхронностью
Всем привет!
Написал небольшой скрипт который выбирает лучшие места в зале кинотеатра. Проверяю в консоле все ок, а вот вывести переменную наружу не могу, запутался окончательно. Кто то может подсказать, как сделать так что бы при вызове 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; // то что нужно в итоге } } } }); }; |
Куда "наружу"?
Ни callback-функции, ни промисы, ни "промисифицированные функции", ни async-функции не умеют возвращать (return) "наружу" значения (только "промис в ожидании" в последних двух случаях). Это главный момент, который нужно иметь в виду про "асинхронность". |
Часовой пояс GMT +3, время: 21:59. |