在 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);
});
所以这是模块:
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);
});