Не удалось установить переменную на основе вывода JSON

#javascript #c# #asp.net-core

Вопрос:

У меня есть вызов api, который извлекает некоторые данные JSON, и я хочу установить переменную, если есть пустой столбец с именем result.

Когда я запускаю код, он устанавливает UncompletedProcesses = true, если он соответствует этому условию, но когда я проверяю его в конце, он говорит, что он не определен в строке.

 if ((URMajIssues == true) amp;amp; (URDeviation == false) amp;amp; (UncompletedProcesses == true)) 
 

Это код, который я использую, что я делаю не так, пожалуйста:

 //Check to see if all processes have been completed on all stages
var UncompletedProcesses
var request = new XMLHttpRequest()
var stage = 0; 
var ModuleIdent = '@HttpContext.Session.GetString("sesMIdent")'
// Open a new connection, using the GET request on the URL endpoint
request.open('GET', 'https://xxxxxxx.azurewebsites.net/api/rou/'   stg   '/'   MIdent  '/5317dba3', true)


request.send = function () {

    // Begin accessing JSON data here
    var data = JSON.parse(this.response)

    data.forEach((data) => {
        if (data['result'] == '')
        {
            UncompletedProcesses = true;
        }
    })
}
// Send request
request.send()

alert(UncompletedProcesses)
if ((URMajIssues == true) amp;amp; (URDeviation == false) amp;amp; (UncompletedProcesses == true)) {
          
    document.getElementById('lblWarningMsg').innerText = 'A Major issue has been identified. This needs to be repaired'
    
    $('#modal-warning').modal({ backdrop: 'static', keyboard: false })
}
 

Большое спасибо за вашу помощь.

Комментарии:

1. Можем ли мы увидеть образец ответа json?

2. Где находятся URMajIssues и URDeviation определены?

Ответ №1:

В вашем коде есть пара проблем, которые заключаются в следующем.

Непреднамеренное переопределение Send функции

Я думаю, что этот небольшой фрагмент кода здесь неверен:

 request.send = function () {
    // Begin accessing JSON data here
    var data = JSON.parse(this.response);

    data.forEach((data) => {
        if (data["result"] == "") {
            UncompletedProcesses = true;
        }
    });
}
 

Происходит то, что базовая реализация «отправить» переписывается с вашей логикой, что неверно.

Что действительно нужно сделать здесь, так это определить onreadystatechange метод для вашего объекта запроса следующим образом:

 request.onreadystatechange = function () {
    // Begin accessing JSON data here
    var data = JSON.parse(this.response);

    data.forEach((data) => {
        if (data["result"] == "") {
            UncompletedProcesses = true;
        }
    });
}
 

Изменения Потока Кода

Еще одна проблема-это поток кода. onreadystatechange function Определение для обработки ответа должно включать логику оповещения и проверку переменных URMajIssues / URDeviation , а также.

Если вы оставили этот фрагмент кода там, где он есть, он будет запущен задолго до того, как ответ будет доступен с сервера. onreadystatechange Функция будет вызвана только после ответа сервера, поэтому любой код, зависящий от этого результата, также должен находиться внутри этой функции.

Ниже показано, каким должен быть поток кода:

 //Check to see if all processes have been completed on all stages
var UncompletedProcesses;
var request = new XMLHttpRequest();
var stage = 0;
var ModuleIdent = '@HttpContext.Session.GetString("sesMIdent")';
// Open a new connection, using the GET request on the URL endpoint
request.open("GET", "https://xxxxxxx.azurewebsites.net/api/rou/"   stg   "/"   MIdent   "/5317dba3", true);

request.onreadystatechange = function () {
    // Begin accessing JSON data here
    var data = JSON.parse(this.response);

    data.forEach((data) => {
        if (data["result"] == "") {
            UncompletedProcesses = true;
        }
    });
    
    alert(UncompletedProcesses);
    if (URMajIssues == true amp;amp; URDeviation == false amp;amp; UncompletedProcesses == true) {
        document.getElementById("lblWarningMsg").innerText = "A Major issue has been identified. This needs to be repaired";
        $("#modal-warning").modal({ backdrop: "static", keyboard: false });
    }
};

// Send request
request.send();