【问题标题】:can't access firebase database snapshot values outside promises [duplicate]无法访问承诺之外的firebase数据库快照值[重复]
【发布时间】:2017-07-03 09:48:16
【问题描述】:

我无法访问 Promise 之外的快照值。我有这些功能

function getAuthorData() {
  metadataRef
    .child("author")
    .on("value", (snap) => {
      return snap.val()
    })
}

function getSiteSocialLinks() {
  metadataRef
    .child("social")
    .on('value', (snap) => {
      return snap.val();
    })
}

function getFeaturedPosts() {
  featuredRef.on('value', (snap) => {
    return snap.val();
  })
}

function getBlogPosts() {
  blogPostsRef
  .orderByChild('createOn')
  .on('value', (snap) => {
    return snap.val()
  });
}

function getPostCategories() {
  postRef
  .child('categoryStats')
  .on('value', (snap) => {
    return snap.val();
  });
}

function getTotalPostsLength() {
  postRef
  .child('nopp')
  .on('value', (snap) => {
    return snap.val();
  })
}

当我尝试这个时

var ourPosts = getBlogPosts()
  var ourCategories = getPostCategories()
  var totalnumOfPosts = getTotalPostsLength()

  console.log(`Our post: ${ourPosts}\n our categories: ${ourCategories}\n total number of posts: ${totalnumOfPosts}\n`)

这是我得到的

我们的帖子:未定义我们的类别:未定义的帖子总数: 未定义

我真的不知道它是否与范围有关。请帮忙

【问题讨论】:

  • 异步代码每次都会这样搞砸你
  • 那么出路是什么?
  • 使用承诺,因为它们应该被使用,也许?由于您的函数不返回任何内容,因此有点困难
  • 我已经将它们的值一一记录在其中,并且它们都正确记录了它们的值
  • 但会在承诺之外记录 undefined

标签: javascript firebase scope firebase-realtime-database promise


【解决方案1】:

你没有按照应有的方式使用 Promise。

试试这个:

getBlogPosts().then(value => {
  console.log(value);
});

getPostCategories().then(value => {
  console.log(value);
});

getTotalPostsLength().then(value => {
  console.log(value);
});

并在每个metadataRef 之前添加一个return,类似于:

function getAuthorData() {
  return metadataRef
    .child("author")
    .on("value", (snap) => {
      return snap.val()
    })
}

function getSiteSocialLinks() {
  return metadataRef
    .child("social")
    .on('value', (snap) => {
      return snap.val();
    })
}

function getFeaturedPosts() {
  return featuredRef.on('value', (snap) => {
    return snap.val();
  })
}

function getBlogPosts() {
  return blogPostsRef
  .orderByChild('createOn')
  .on('value', (snap) => {
    return snap.val()
  });
}

function getPostCategories() {
  return postRef
  .child('categoryStats')
  .on('value', (snap) => {
    return snap.val();
  });
}

您可能需要阅读一些关于“为什么存在 Promise”的内容,这样您就会明白为什么需要以这种方式使用它。

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2017-01-30
    • 2020-12-18
    相关资源
    最近更新 更多