【问题标题】:Object not writing to JSON in javascript when ussing Object.assign使用 Object.assign 时对象未在 javascript 中写入 JSON
【发布时间】:2020-02-05 03:34:49
【问题描述】:

我正在尝试向从包含用户信息的 firebase 数据库获得的临时 JSON 添加一个值,这样我就可以将用户名添加到调用的帖子值中,而无需实际将用户名放入帖子 JSON 中以保存数据。我遇到了一个问题,即 Object.assign 方法在 JSON 中创建了一个新字段,但该字段中没有写入任何内容。我将如何解决这个问题? 我的代码如下:

getPosts = (limit = 20) => {
    var list = [];
    firebase.firestore()
      .collection("posts").get().then((querySnapshot) => {
        querySnapshot.forEach((doc) => {
          var userName = "";
          firebase.firestore().collection("users").where('email', '==', doc.data().email).get().then((querySnapshot) =>
            querySnapshot.forEach((doc2) => {
                userName = doc2.data().name;
              }
            )
          );
          var tempList = doc.data();
          console.log(tempList);
          Object.assign(tempList, {
            "userName": userName
          });
          console.log(tempList);
          list.push(tempList);  
        });
        list.sort(function(a, b) {
          var c = b.timestamp;
          var d = a.timestamp;
          return c - d;
        })
        this.setState({
          data: list,
          fullData: list
        });
      });

    return new Promise((resolve, reject) => {
      this.func;
      resolve(_.take(this.state.fullData, limit));
    });
  };

这段代码是 react native 中的一个函数。它基本上是在 javascript 上工作的,所以所有的语法都是一样的。任何帮助将不胜感激。提前谢谢!

【问题讨论】:

  • 它看起来也不适用于 JS。您确定发布了相同的代码吗?
  • tempList 的 console.log 显示什么?是对象还是数组?
  • 我确信这段代码会打印出用户数据的 Jason,但是在对象调用之后,只显示键,没有值,而是一个空字符串
  • console.log 显示一个对象

标签: javascript json firebase react-native


【解决方案1】:

您的代码有几个部分是错误的。在运行 then() 子句之后的下一条语句之前,您不能指望承诺会得到解决。

请改用aysnc/await。我没有测试这段代码,但你可以这样做:

firebase.firestore()
  .collection("posts").get().then((querySnapshot) => {
      querySnapshot.forEach(async (doc) => {
        var userName = "";
        var tempList = doc.data();
        const usersQs = await firebase.firestore().collection("users").where('email', '==', doc.data().email).get();
        usersQs.forEach(doc2 => (userName = doc2.data().name));
        tempList.userName = userName;
        list.push(tempList);
      });

【讨论】:

  • 这出乎意料地对我有用。谢谢!此外,当我实现此代码时,我的提要不断刷新并且仅显示 FlatList 元素一秒钟,然后它们消失,直到我再次重新引导。我该如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2017-06-29
  • 2022-11-27
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多