返回Node.js中回调函数的值

时间:2017-01-14 03:15:30

标签: node.js asynchronous asynccallback

我对回调函数有疑问。考虑一下这个简单的代码:

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方法在内的第一个片段如何使用相同的逻辑?

谢谢。

3 个答案:

答案 0 :(得分:1)

fsAsynchronous 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);
  });
}