#javascript #arrays #json #xml #promise
Вопрос:
В принципе, я хотел, чтобы данные из JSON были доступны за пределами функции xml, так как у меня есть несколько функций, для которых я хочу их использовать.
Поэтому, когда я впервые попробовал его и попытался зарегистрировать, он действительно показывал массивы с объектами в нем. Но когда я сделал то же самое, но вместо этого проверил длину, она оказалась равной нулю. Я посмотрел это и обнаружил, что это происходит потому, что обе функции работают синхронно. Поэтому я изучил обещания и реализовал их следующим образом:
let allTasks = [] // Read data const dataPromise = new Promise((resolve, reject)=gt;{ const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (xhttp.readyState == 4 amp;amp; xhttp.status ==200) { const myData = JSON.parse(this.responseText) allTasks = allTasks.push.apply(allTasks, myData) resolve() } } xhttp.open("GET", "data.json", true); xhttp.send(); }) dataPromise.then(()=gt;{ dataUse() }) // Show data dataUse = () =gt;{ console.log(allTasks) // All variables const todos = document.querySelector('.todo') const todoInput = document.getElementById('new-todo') const added = document.getElementById('added') const itemsLeft = document.querySelector('.items-left gt; span') allTasks.forEach((datas)=gt;{ const todo = document.createElement('div') todos.appendChild(todo) const input = document.createElement('input') input.setAttribute('type', 'checkbox') input.setAttribute('id', datas.name) input.setAttribute('class', 'checks') todo.appendChild(input) const label = document.createElement('label') label.setAttribute('for', datas.name) label.setAttribute('class', `${datas.name} tasks`) todo.appendChild(label) const span = document.createElement('span') label.appendChild(span) const paragraph = document.createElement('p') paragraph.innerHTML = datas.todo label.appendChild(paragraph) }) }
Но теперь регистрация дает мне число, а не массив с объектами, поэтому функция не сможет делать то, что она должна.
Так как же мне это исправить?
Комментарии:
1. Это работает, но это не то, о чем я просил. Передача данных в качестве аргумента в dataUse означает, что они могут использоваться только в dataUse, и, как я уже сказал, у меня есть и другие функции, для которых я хочу их использовать.
Ответ №1:
Проблема в том, что вам не нужно присваивать возвращаемое значение push
операции переменной, потому что возвращаемое значение-это длина массива. Просто нажмите в массив, и переменная будет содержать последнее содержимое.
Вместо allTasks = allTasks.push.apply(allTasks, myData)
того , чтобы делать allTasks.push(allTasks, myData)
.
Было бы хорошо, если бы вы использовали const
вместо let
.
const allTasks = []; allTasks.push(allTasks, myData);
Комментарии:
1. Я использовал let, потому что с помощью const, когда я пытаюсь вставить в него массив, он выдает ошибку. Приложение было добавлено, поэтому оно помещает объекты из массива myData в allTask, а не помещает массив в другой массив. Кроме того, я сделал то, что ты сказал, и это все еще дает мне номер.