TypeError:无效的解构不可迭代实例的尝试。为了可迭代,非数组对象必须有一个 [Symbol.iterator]()

Posted

技术标签:

【中文标题】TypeError:无效的解构不可迭代实例的尝试。为了可迭代,非数组对象必须有一个 [Symbol.iterator]()【英文标题】:TypeError: Invalid attempt to destructure non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() 【发布时间】:2021-07-14 08:08:40 【问题描述】:

您好,阅读此问题的人。我将 Vue 2 与 firebase 一起使用。我想获取包含对象的 Array 列表。该列表从 firebase 实时数据库中成功获取,但问题是当我想将此数组存储到 Vuex 状态时出现此错误

TypeError:无效的解构不可迭代实例的尝试。为了可迭代,非数组对象必须有一个 Symbol.iterator

这是我从 firebase 实时数据库中获取数据的代码

 getAllProject() 
    //var result = [];
    var userId = store.state.user.user.uid;
    var project_ref = database.ref("projects/" + userId + "/");
    project_ref.on("value", function(snapshot) 
      if (snapshot.hasChildren) 
        snapshot.forEach(function(DataSnapsho) 
          try 
            store.dispatch("projects/set_poject", DataSnapsho.val());
           catch (error) 
            console.log(error);
          
        );
      
    );
  

这是我的 Vuex 代码 export const namespaced = true;

export const state = 
  test: []
;

export const mutations = 
  SET_PROJECT(state, paylod) 
    state.test.push(paylod);
  
;

export const actions = 
  set_poject([commit], paylod) 
    commit("SET_PROJECT", paylod);
  
;

这是我调用 getAllProject 方法的地方

     mounted() 
    read_project.getAllProject();
  ,

输出错误是这样的

TypeError: Invalid attempt to destructure non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.
    at _nonIterableRest (nonIterableRest.js?3d8c:2)
    at _slicedToArray (slicedToArray.js?3835:6)
    at Store.set_poject (projects.js?f817:296)
    at Array.wrappedActionHandler (vuex.esm.js?2f62:851)
    at Store.dispatch (vuex.esm.js?2f62:516)
    at Store.boundDispatch [as dispatch] (vuex.esm.js?2f62:406)
    at eval (readProject.js?72b9:18)
    at eval (index.esm.js?e947:4417)
    at LLRBNode.inorderTraversal (index.esm.js?e947:2769)
    at SortedMap.inorderTraversal (index.esm.js?e947:3219)

实际的数组是这个

【问题讨论】:

【参考方案1】:

问题在于你的这行代码:

set_poject([commit], paylod) 
    commit("SET_PROJECT", paylod);
  

实际上commit 在对象内部,您不能将对象解构为数组。因此,当您尝试这样做时,它会给出错误 destructure non-iterable instance。

像这样更新代码:

set_poject(commit, paylod) 
    commit("SET_PROJECT", paylod);
  

【讨论】:

以上是关于TypeError:无效的解构不可迭代实例的尝试。为了可迭代,非数组对象必须有一个 [Symbol.iterator]()的主要内容,如果未能解决你的问题,请参考以下文章

Redux Web 扩展 - 未捕获的 TypeError:传播不可迭代实例的无效尝试

我的应用程序运行良好,但现在显示错误 [未处理的承诺拒绝:TypeError:传播不可迭代实例的无效尝试

添加到数组时“传播不可迭代实例的无效尝试”

传播不可迭代实例的尝试无效。为了可迭代,非数组对象必须具有 [Symbol.iterator]() 方法

# 字符串方法 TypeError: 列在 pyspark 中不可迭代

渲染时捕获 TypeError:“BoundField”对象不可迭代