【问题标题】:return value of a callback function in Node.jsNode.js 中回调函数的返回值
【发布时间】:2018-06-02 19:48:13
【问题描述】:

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

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..这是为什么?如果在之前的 sn-p 中我可以将data 记录到终端,为什么我不能返回值并将其记录到控制台?包含map 方法的第一个sn-p 如何使用相同的逻辑工作?

谢谢。

【问题讨论】:

    标签: node.js asynchronous asynccallback


    【解决方案1】:

    fs 是一个Asynchronous function,它不返回值,因为它不知道该值何时可用,因为它记录了undefined

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

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

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

    【讨论】:

    • 所以如果你是console.logging(就像我的例子)console.log() 将是fs.readdir函数的回调?
    • 没有。您的示例中的console.log() 在执行后在fs.readdir() 的回调中执行。
    • 如何使用数据值进行前端渲染?
    • @AjitSingh 这是在服务器中。要在前端客户端使用它,您需要通过 API 将此数据发送到前端。写一个api来做上面的文件系统操作并返回数据
    • @superUser 如果我的路由器有功能,我可以像这样渲染到前端 res.render('aspects',{ results : results, });
    【解决方案2】:

    因为map()方法by definition返回一个数组,而fs.readdir()返回未定义。

    为什么它返回undefined是因为它是一个异步函数,结果不是由函数返回而是在callback你必须等待,那是因为你必须在那个回调函数里面做console.log .

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

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

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

    【讨论】:

      【解决方案3】:

      我希望以下内容可以帮助其他在使用套接字 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);
        });
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 2014-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多