所以这是模块:
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。我意识到模块调用在函数完全运行之前发生。我该如何解决这个问题?
答案 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);
});