Я работаю с приложением rails. Мне нужно получить статус каждого выбранного устройства. Я могу добиться этого, но после выполнения я помещаю предупреждение «Успешно создана запись выполнения». Для каждого выбора Mac отображается предупреждающее сообщение. Мне нужно дать одно предупреждение в конце выполнения. Я вызываю display_result в методе call_endpoint. Поскольку это вызов Ajax, он выдает предупреждение для каждого выполнения. Я не знаю, как ограничить это одним предупреждением.
function display_result() {
$('#http_status').html("");
$('#http_status').append(result["response"].status);
if (result["response"].status == "404") {
console.info("HTTP 404");
$('#response_div').addClass("bs-callout-warning");
} else if (result["response"].status == "520") {
console.info("HTTP 502");
$('#response_div').addClass("bs-callout-danger");
} else {
console.info("HTTP 200");
$('#response_div').addClass("bs-callout-success");
if (result["response"].status == "200") {
// $('.loader').show();
$('#cover-spin').show();
$.ajax({
method: "GET",
dataType: "text",
url: "create_execution",
data: {
http_status: result["response"].status,
mac_address: mac,
},
success: function (execution_record_id) {
$('#cover-spin').hide();
alert('Successfully created execution record");
}
});
}
function call_endpoint() {
var values = new Array();
webpa = $('#Device-PA').is(":visible");
rpil = $('#Device-SN').is(":visible");
groupselect = $('#Group-Select').is(":visible");
parameter_name = $('#tr_object').val();
if (webpa) {
$.each($("input[name='checkBox[]']:checked").closest("td").next("td"), function () {
values.push($(this).text().trim())
});
m = values.length
} else {
$.each($("input[name='checkBox[]']:checked").closest("td").next("td"), function () {
values.push($(this).text().trim())
});
m = values.length
}
serialnumber = $('#pa_serialnumber').val();
oid = $('#sn_serialnumber').val();
protocol = {
pa: pa,
sn: sn,
}
if (pa) {
for (var i = 0; i < m; i++) {
(function () {
var macAdd = values[i];
$.ajax({
method: "GET",
url: "get_object",
dataType: "json",
data: {
parameter: parameter_name,
mac: macAdd,
protocol: protocol,
serialnumber: serialnumber,
},
success: function (result) {
console.info(result);
NProgress.done();
console.info("result for webpa");
display_result();
},
statusCode: {
404: function () {
console.info("Call failed");
}
}
});
})();
}
}
Проверьте строку alert('Успешно создана запись выполнения"); и замените одну из кавычек... вы используете простую первую, двойную последнюю
Вы можете заменить $.when() и $.map() на цикл for и использовать .then() для выполнения одной функции после завершения всех запросов. Где result определен в функции display_result()?
Что такое mac внутри display_result()?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Below is changed code..
Скопируйте приведенный ниже код как есть.
function display_result(total,current) {
$('#http_status').html("");
$('#http_status').append(result["response"].status);
if (result["response"].status == "404") {
console.info("HTTP 404");
$('#response_div').addClass("bs-callout-warning");
} else if (result["response"].status == "520") {
console.info("HTTP 502");
$('#response_div').addClass("bs-callout-danger");
} else {
console.info("HTTP 200");
$('#response_div').addClass("bs-callout-success");
if (result["response"].status == "200") {
// $('.loader').show();
$('#cover-spin').show();
$.ajax({
method: "GET",
dataType: "text",
url: "create_execution",
data: {
http_status: result["response"].status,
mac_address: mac,
},
success: function (execution_record_id) {
$('#cover-spin').hide();
if (total == current)
{
alert('Successfully created execution record");
}
}
});
}
}
}
function call_endpoint() {
var values = new Array();
webpa = $('#Device-PA').is(":visible");
rpil = $('#Device-SN').is(":visible");
groupselect = $('#Group-Select').is(":visible");
parameter_name = $('#tr_object').val();
if (webpa) {
$.each($("input[name='checkBox[]']:checked").closest("td").next("td"), function () {
values.push($(this).text().trim())
});
m = values.length
} else {
$.each($("input[name='checkBox[]']:checked").closest("td").next("td"), function () {
values.push($(this).text().trim())
});
m = values.length
}
serialnumber = $('#pa_serialnumber').val();
oid = $('#sn_serialnumber').val();
protocol = {
pa: pa,
sn: sn,
}
if (pa) {
for (var i = 1; i <= m; i++) {
(function () {
var macAdd = values[i];
$.ajax({
method: "GET",
url: "get_object",
dataType: "json",
data: {
parameter: parameter_name,
mac: macAdd,
protocol: protocol,
serialnumber: serialnumber,
},
success: function (result) {
console.info(result);
NProgress.done();
console.info("result for webpa");
display_result(m,i);
},
statusCode: {
404: function () {
console.info("Call failed");
}
}
});
})();
}
}
}
что тут общего?
вы отправляете количество массивов как m в функцию.. так что total == m в display_result (m, i);
же. Получение оповещения в два раза
значения i совпадают со значением m.
result и mac не определены в функции display_result. result, по-видимому, предназначен для получения результирующего значения объекта обещания jQuery, возвращаемого из $.ajax(). Я не уверен, что такое mac.
Вы можете заменить $.when() и $.map() на цикл for, return — объект обещания jQuery из call_endpoint(), включить обработку ошибок, цепочку вызовов .then() и call_endpoint() для выполнения alert() один раз.
function call_endpoint() {
return $.when.apply($, $.map(values, function(macAdd) {
return $.ajax().then(display_result)
}))
}
callEnpoint()
.then(function() {
alert('Successfully created execution record');
}, function(jqxhr, textStatus, errorThrown) {
console.error(errorThrown)
});
function display_result(reuslt) {
..
if (if (result["response"].status == "200")) {
return $.ajax() // remove `alert()` from `success`
}
return;
}
Мне нравится предложение для $.when. Я собирался написать об этом, но пока не было времени написать ответ. Поскольку кто-то уже сделал это за меня, теперь мне не нужно.
У вас есть опечатка в
alert('Successfully created execution record");, она должна предупредить («Успешно создана запись выполнения»);