VueJS: свойства массива не определены после выборки данных с помощью axios

#javascript #vue.js #axios

#javascript #vue.js #аксиос

Вопрос:

В настоящее время я пытаюсь разработать что-то с помощью VueJS, где я извлекаю данные с помощью Axios и помещаю их в массив.

Это мой объект данных

     data() {
    return {
        uid: [], // Each element contains a JSON containing the node and an array containg UID and operator name
        timer: null,
        tasks: [],
        nodes: [
            'assembler',
            'device'
        ]
    }
 

В created я вызываю функции для выборки данных через axios

  created:  function() {
  // Get current uids and tasks, if there are any
  this.fetchUID()
  this.fetchTasks()


}
 

И это мои методы

 methods: {
    fetchUID() {
        var obj = {}
        this.nodes.forEach(node => 
        axios.get('http://localhost:8080/'   node)
        .then(res => res.data.length > 0 ? obj[node] = [res.data[0].id, res.data[0].operator.name] : console.log("No data found for "   node   
        ". It seems there is no instance of "   node))
        .catch(err => console.log(err))
        )
        this.uid.push(obj)
    },
    fetchTasks() {
        // console log for testing
        console.log(this.uid[0].assembler)


    }
}
 

console.log(this.uid[0].assembler) возвращает undefined , хотя я вижу в консоли разработчика VueJS, которая uid[0].assembler определена и должна что-то возвращать. Почему он так себя ведет и как я могу это исправить?

Ответ №1:

fetchUID является ли асинхронным, поэтому выполняется fetchTasks после завершения выполнения fetchUID

 created:  function() {
  // Get current uids and tasks, if there are any
  this.fetchUID()
  // this.fetchTasks() to be executed later

},
methods: {
    fetchUID() {
        var obj = {}
        this.nodes.forEach(node => 
        axios.get('http://localhost:8080/'   node)
        .then(res => res.data.length > 0 ? obj[node] = [res.data[0].id, res.data[0].operator.name] : console.log("No data found for "   node   
        ". It seems there is no instance of "   node))
        .catch(err => console.log(err))
        )
        this.uid.push(obj);
        this.fetchTasks(); // Execute here
    },
    fetchTasks() {
        // console log for testing
        console.log(this.uid[0].assembler)


    }
}
 

Ответ №2:

Я наконец нашел ответ, проблема заключается в этой части кода

 fetchUID() {
    var obj = {}
    this.nodes.forEach(node => 
    axios.get('http://localhost:8080/'   node)
    .then(res => res.data.length > 0 ? obj[node] = [res.data[0].id, res.data[0].operator.name] : console.log("No data found for "   node   
    ". It seems there is no instance of "   node))
    .catch(err => console.log(err))
    )
    this.uid.push(obj)
}
 

Проблема forEach() в том, что на самом деле это не работает с async / await. Это должно сработать

        async fetchUID() {
       for(let node of this.nodes) {
           try  {
               const { data } = await axios.get(`http://localhost:8080/${node}`);
               if(data.length > 0)
                this.uid[node] = [data[0].id, data[0].operator.name];
               else
                console.log(`No data found for ${node}. It seems there is no instance of ${node}`)
           } catch (error) {
               // error handling
           }
       }
    }