Только одно оповещение для многократного выполнения в Ajax

Я работаю с приложением 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('Successfully created execution record");, она должна предупредить («Успешно создана запись выполнения»);

Mayank Vadiya 01.02.2019 08:11

Проверьте строку alert('Успешно создана запись выполнения"); и замените одну из кавычек... вы используете простую первую, двойную последнюю

Roy Bogado 01.02.2019 08:12

Вы можете заменить $.when() и $.map() на цикл for и использовать .then() для выполнения одной функции после завершения всех запросов. Где result определен в функции display_result()?

guest271314 01.02.2019 08:26

Что такое mac внутри display_result()?

guest271314 01.02.2019 08:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
232
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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");
                        }
                    }
                });
                })();

        }
   }
}

что тут общего?

User1983 01.02.2019 10:07

вы отправляете количество массивов как m в функцию.. так что total == m в display_result (m, i);

Prashant Patil 01.02.2019 10:16

же. Получение оповещения в два раза

User1983 01.02.2019 10:57

значения i совпадают со значением m.

User1983 01.02.2019 11:02

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. Я собирался написать об этом, но пока не было времени написать ответ. Поскольку кто-то уже сделал это за меня, теперь мне не нужно.

VLAZ 01.02.2019 12:21

Другие вопросы по теме