Обратите внимание, что я новичок в JS, поэтому ожидайте любую аберрацию, которую вы можете себе представить.
При этом я пытаюсь создать функцию в JS. Он состоит из трех частей, но конечной целью является заполнение select
некоторыми внешними данными.
Первая - это GET. Здесь я вызываю внешний API, запрашивая общее количество профилей. Кажется, все работает нормально, но всякий раз, когда я делаю console.log(totalProfiles)
вне функции, его значение кажется неопределенным. Я попытался добавить return
в конце, но это не было решением.
var billingArray = [];
var billingProfiles = [];
var billingSelect = document.getElementById('billingSelect');
(function(){
$.ajax({
url: url,
method: 'GET',
crossDomain: true,
withCredentials: true,
dataType: 'JSON',
headers: {
'Authorization': 'Basic '+token,
}
})
.done(function(response) { billingArray.push(response); var totalProfiles = billingArray[0]['total_count']; return totalProfiles; })
.fail(function(jqXHR, textStatus, errorThrown) { console.log(textStatus); });
});
С помощью totalProfiles я бы назвал один и тот же URL, на этот раз, чтобы все профили сохранялись в массиве:
(function(totalProfiles){
$.ajax({
url: url+totalProfiles,
method: 'GET',
crossDomain: true,
withCredentials: true,
dataType: 'JSON',
headers: {
'Authorization': 'Basic '+token,
}
})
.done(function(response) { billingProfiles.push(response); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log(textStatus); });
});
Последняя часть состоит из заполнения select
с помощью for:
function(billingprofiles) {
for (var i = 0; i < billingProfiles.length(); i++) {
var billingProfileId = billingProfiles[i]["ngcp:billingprofiles"]["id"];
var billingProfileName = billingProfile[i]["ngcp:billingprofiles"]["name"];
var opt = document.createElement("option");
opt.value() = billingProfileId;
opt.textContent() = billingProfileName;
dropdown.appendChild(opt);
}
});
Проблема здесь в том, что я не знаю, как вывести totalProfiles из функции, поэтому всякий раз, когда процесс достигает второго, происходит сбой из-за переменная не определена.
Это все, и где вы можете ожидать те аберрации, о которых я говорил ранее. Я думал, что это сработает, но я начинаю подозревать, что то, как я собираюсь это сделать, тоже может быть частью проблемы:
var billingArray = [];
var billingProfiles = [];
var billingSelect = document.getElementById('billingSelect');
var totalProfiles;
//Fetch total number of profiles
(function() {
$.ajax({
url: url,
method: 'GET',
crossDomain: true,
withCredentials: true,
dataType: 'JSON',
headers: {
'Authorization': 'Basic ' + token,
}
}).done(function(response) {
billingArray.push(response);
var totalProfiles = billingArray[0]['total_count'];
return totalProfiles;
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log(textStatus);
});
})().done(function(totalProfiles) {
$.ajax({
url: url + totalProfiles,
method: 'GET',
crossDomain: true,
withCredentials: true,
dataType: 'JSON',
headers: {
'Authorization': 'Basic ' + token,
}
}).done(function(response) {
billingProfiles.push(response);
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log(textStatus);
});
})().done(function(billingprofiles) {
for (var i = 0; i < billingProfiles.length(); i++) {
var billingProfileId = billingProfiles[i]["ngcp:billingprofiles"]["id"];
var billingProfileName = billingProfile[i]["ngcp:billingprofiles"]["name"];
var opt = document.createElement("option");
opt.value() = billingProfileId;
opt.textContent() = billingProfileName;
billingSelect.appendChild(opt);
}
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log(textStatus);
});
Несколько замечаний, чтобы лучше объяснить, что и почему я это сделал: 1 Перед каждым .done
мне приходилось писать ()
, чтобы избежать этой ошибки
(промежуточное значение). Не является функцией
Ошибка, которую я получаю прямо сейчас, возникает в
.done(function(totalProfiles) {
:
Uncaught TypeError: Невозможно прочитать свойство 'done' из неопределенного