我对回调函数有疑问。考虑一下这个简单的代码:
var array = [1,2,3];
console.log(array.map(function(val){
return val * 2
}))
这将正确地重新登录到控制台[2,4,6]
,这意味着它正在“返回”该值。
现在考虑一下(注意:假设“ab”为有效目录)
fs.readdir("ab",function(err,data){
console.log(data)
})
此代码工作正常,并将目录“ab”中的文件名数组打印到终端。但是,相同的代码:
console.log(fs.readdir("ab",function(err,data){
return data
}))
这将打印undefined
..为什么会这样?如果在上一个片段中我可以将data
记录到终端,为什么我不能返回该值并将其记录到控制台?包括map
方法在内的第一个片段如何使用相同的逻辑?
谢谢。
答案 0 :(得分:1)
fs
是Asynchronous function
,它不会返回值,因为它不知道该值何时可用,因为它记录undefined
。
当你说console.log(fs.readdir())
时,它会读取fs
函数并检查它是否返回了在这种情况下为undefined
的任何内容并因此记录它。执行没有进入fs.readdir()的回调,因为它是异步的,需要时间才能完成。
fs.readdir()
就像一个承诺,它会调用读取目录并忘记它,直到读取操作完成,然后调用它的回调函数。
因此,我们传递回调函数,这些函数将在异步操作完成后执行,如下所示:
function readFile (callback){
fs.readdir("ab",function(err,data){
return callback(data);
});
}
readFile(function (data){
console.log(data);
});
答案 1 :(得分:0)
因为map()
方法by definition返回一个数组,而fs.readdir()
返回undefined。
为什么它返回undefined
是因为它是一个异步函数,结果不是由函数返回的,而是在callback
你需要等待,因为你必须这样做回调函数中的console.log。
仅为了您的信息,fs
模块也有synchronous版本的方法,因此在这种情况下您可以这样做:
console.log(fs.readdir("ab"))
但是使用同步版本会阻止代码,直到得到结果,因此根据情况不建议使用;这取决于你的情况。
答案 2 :(得分:0)
我希望以下内容可以帮助其他有类似问题的人使用socket io从MongoDB中读取值。
在这些情况下,您可以使用以下代码(服务器端的两个功能):
socket.on('readTopicMessages', (intGr, callback) => {
readTopicChats(intGr, function (data){
io.emit('topicMessages', data);
});
});
function readTopicChats (intGr, callback){
All_Chats
.find({ 'intGr': intGr.intGr })
.sort([['dateTime', 'ascending']])
.exec(function (err, data){
return callback(data);
});
}