javascript - Firebase 查询函数返回未定义

标签 javascript firebase firebase-realtime-database

<分区>

我想编写一个返回对象的查询函数。问题是,在我的例子中,函数返回 undefined

var filterDataAccordingToDate = function (ref, startTime, endTime) {

    var filteredObj = {};

    ref.orderByChild('date').startAt(startTime).endAt(endTime)
    .once('value', function(snap) {
       filteredObj = snap.val();

       console.log(util.inspect(filterDataAccordingToDate(filteredObj, false, null));
      //Returns the correct object

       return filteredObj;
    });  
}

console.log("DATA RETURNED: " + util.inspect(filterDataAccordingToDate(travelRef, 1466439004, 1466439011), false, null));
// DATA RETURNED: undefined

最佳答案

作为Ami提到,您不能从异步调用返回结果。

您可以做的是使用一种方法处理您的结果,并直接调用您的异步调用而不期望返回结果:

var filterDataAccordingToDate = function (ref, startTime, endTime) {
  ref.orderByChild('date').startAt(startTime).endAt(endTime)
    .once('value', function(snap) {
      var filteredObj = snap.val();

      console.log(util.inspect(filterDataAccordingToDate(filteredObj, false, null));
      doSomethingWith(filteredObj);
  });  
}

function doSomethingWith(obj) {
  console.log("DATA RETURNED: " + util.inspect(obj, false, null));
}

filterDataAccordingToDate(travelRef, 1466439004, 1466439011);

我想这完全取决于您要对数据执行的操作以及您希望引用数据的次数。

注意:我确实建议将您的脚本放在一个独立的函数中以避免添加私有(private)函数(特定于单个功能),这样您就不会污染您的全局命名空间。 Ben Alman写了一篇关于立即调用函数表达式 (IIFE) 的好文章,或者您可以使用 JavaScript namespace .

编辑:作为adolfosrs建议,你也可以使用 promises但请记住什么browsers你愿意支持。

关于javascript - Firebase 查询函数返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37927555/

相关文章:

javascript - Grails JS缩小插件

javascript - jQuery 和 CSS :before

javascript - 如何在 Firebase 中监听多个特定位置的数据更改?

java - 在 Android Activity 中从 Firebase 检索数据

javascript - 当用户完成输入时运行 JS 代码

php - 当包含特定文件扩展名时如何将类添加到超链接?

java - Android 中的 Firebase 加入数据

ios - 找不到 Firebase 框架

firebase - 为什么我在 Firebase Cloud Firestore Emulator UI 中看不到数据?

ios - 关注者计数器未更新 firebase 中的节点