Массив ведения журнала возвращает число, когда это не предполагается

#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, а не помещает массив в другой массив. Кроме того, я сделал то, что ты сказал, и это все еще дает мне номер.