Только одно предупреждение для множественного выполнения в Ajax - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю с приложением 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.log("HTTP 404");
    $('#response_div').addClass("bs-callout-warning");
} else if (result["response"].status == "520") {
    console.log("HTTP 502");
    $('#response_div').addClass("bs-callout-danger");

} else {
    console.log("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.log(result);
                        NProgress.done();
                        console.log("result for webpa");

                        display_result();
                    },

                    statusCode: {
                        404: function () {
                            console.log("Call failed");
                        }
                    }
                });
                                  })();

        }
   }

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

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;
}
0 голосов
/ 01 февраля 2019

Ниже приведен измененный код ..

Скопируйте приведенный ниже код как есть.

function display_result(total,current) {

$('#http_status').html("");
$('#http_status').append(result["response"].status);

if (result["response"].status == "404") {

    console.log("HTTP 404");
    $('#response_div').addClass("bs-callout-warning");
} else if (result["response"].status == "520") {
    console.log("HTTP 502");
    $('#response_div').addClass("bs-callout-danger");

} else {
    console.log("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.log(result);
                        NProgress.done();
                        console.log("result for webpa");

                        display_result(m,i);
                    },

                    statusCode: {
                        404: function () {
                            console.log("Call failed");
                        }
                    }
                });
                })();

        }
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...