在 Firebase 中同步接收数据

Receive data synchronously in 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,它会 returns 预期的结果,但是当我将它作为一个模块并从另一个文件调用它时,它 returns 未定义。我意识到模块调用发生在函数完全运行之前。我该如何解决这个问题?

您可以像这样在您的文件中简单地实现一个 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);
});

像这样的承诺的好处是,您可以 return 一个新的承诺并保持 .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);
});

用户@copy 在 Whosebug 的 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);
});