return Node.js 中回调函数的值

return value of a callback function in Node.js

我有一个关于回调函数的问题。考虑这个简单的代码:

var array = [1,2,3];

   console.log(array.map(function(val){

   return val * 2

}))

这将正确地登录回控制台 [2,4,6],这意味着它是 "returning" 返回的值。

现在考虑这个(注意: 假设 "ab" 是一个有效的目录)

fs.readdir("ab",function(err,data){
   console.log(data)
})

此代码工作正常,并将目录 "ab" 中的一组文件名打印到终端。但是,相同的代码:

console.log(fs.readdir("ab",function(err,data){
    return data
}))

这将打印 undefined.. 这是为什么?如果在前面的代码片段中我可以将 data 记录到终端,为什么我不能 return 值并将其记录到控制台?包含 map 方法的第一个片段如何使用相同的逻辑工作?

谢谢。

fs 是一个 Asynchronous function,它没有 return 值,因为它不知道该值何时可用,因此它会记录 undefined.

当你说 console.log(fs.readdir()) 时,它会读取 fs 函数并检查它是否正在 returning 任何东西,在这种情况下是 undefined 并因此记录它。执行 尚未进入 fs.readdir() 的回调 ,因为它是异步的,需要时间才能完成。

fs.readdir()就像一个承诺,它调用读取目录并忘记它,直到读取操作完成,然后调用它的回调函数。 因此,我们传递回调函数,当异步操作完成执行时将被回调,如下所示:

function readFile (callback){
 fs.readdir("ab",function(err,data){
   return callback(data);
 });
}

readFile(function (data){
  console.log(data);
});

因为map()方法by definition returns an array, and fs.readdir()returns未定义。

为什么returnsundefined是因为它是一个异步函数,结果不是函数返回而是在callback你要等待,那是因为你有在该回调函数中执行 console.log。

仅供参考,fs 模块也有 synchronous 版本的方法,因此在这种情况下您可以这样做:

console.log(fs.readdir("ab"))

但是使用同步版本你会阻塞你的代码直到你得到结果,所以根据情况不推荐它;这取决于你的情况。

我希望以下内容能帮助其他遇到类似问题的人使用套接字 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);
  });
}