在Firebase中同步接收数据

时间:2015-06-06 01:45:25

标签: node.js firebase

所以这是模块:

module.exports = function(word) {
  fb.once('value', function(snapshot) {
      var data = snapshot.val();
      data.forEach(function(dataSnap) {
          var index = word.indexOf(' ');
          var first = dataSnap.Name.substring(0, index);
          var last = word.substring(index + 1);
          var candidate = dataSnap.Name;
          if (candidate.indexOf(first) >= 0 && candidate.indexOf(last) >= 0)
            return dataSnap.CID;
      });
  });
}

以下是使用该模块的示例代码:

var nameDB = require('./fire.js');
console.log(nameDB('John Doe'));

如果我要执行模块的console.log,它会返回预期的结果,但是当我将它作为模块并从另一个文件调用它时,它将返回undefined。我意识到模块调用在函数完全运行之前发生。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您可以简单地在您的文件中实现Javascript承诺,如下所示:

module.exports = function(word) {
  return new Promise(function(resolve, reject) { 
      fb.once('value', function(snapshot) {
          var data = snapshot.val();
          data.forEach(function(dataSnap) {
              var index = word.indexOf(' ');
              var first = dataSnap.Name.substring(0, index);
              var last = word.substring(index + 1);
              var candidate = dataSnap.Name;
              if (candidate.indexOf(first) >= 0 && candidate.indexOf(last) >= 0)
                resolve(dataSnap.CID);
              else
                reject('Some sort of failure')
          });
      });
  });
}

然后在你需要它的文件中

var nameDB = require('./fire.js');

nameDB('John Doe')
.then(function(data) {
   console.log(data);
});

像这样的承诺的好处是,你可以返回一个新的承诺,并保持.then火车这样:

nameDB('John Doe')
.then(function(data) {
   console.log(data);
   return nameDB('Paul Walker');
})
.then(function(data) {
   console.log(data);
   return nameDB('Big Mike and The Boys');
})
.then(function(data) {
   console.log(data);
})
.catch(function(err) {
   console.log(err);
});

答案 1 :(得分:-1)

用户@copy在StackOverflow的Javascript聊天室中向我建议使用回调。使用回调似乎已经解决了我的问题。新代码如下:

module.exports = function(word, callback) {
  fb.once('value', function(snapshot) {
    var data = snapshot.val();
    data.forEach(function(dataSnap) {
        var index = word.indexOf(' ');
        var first = dataSnap.Name.substring(0, index);
        var last = word.substring(index + 1);
        var candidate = dataSnap.Name;
        if (candidate.indexOf(first) >= 0 && candidate.indexOf(last) >= 0)
          callback(dataSnap.CID);
    });
  });
}

和另一个文件:

nameDB('John Doe' , function(word){
  console.log(word);
});