#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();