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

标签 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
}))

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

谢谢。

最佳答案

fs 是一个异步函数,它不返回值,因为它不知道该值何时可用,因此它会记录未定义

当您说console.log(fs.readdir())时,它会读取fs函数并检查它是否返回任何在本例中为未定义的内容,然后将其记录下来。执行尚未进入 fs.readdir() 的回调内部,因为它是异步的,需要时间才能完成。

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

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

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

关于node.js - Node.js 中回调函数的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41646445/

相关文章:

node.js - 带 Lambda 集成的无服务器响应模板

javascript - Sequelize js Node 事务

c# - 抑制来自空异步方法的警告

node.js - 如何使用 Tape 测试异步函数抛出错误?

c# - SemaphoreSlim.WaitAsync 如何允许异步函数的顺序执行?

javascript - 我如何最终在 Lambda 函数中返回 promise 的值?

javascript - 异步回调函数返回结果

node.js - nodejs异步的while

c# - 回调函数 : passing callbacks from a C# winform app to a referenced VC++ Exe

node.js - 在 Nodejs 中使用 jimp 包裁剪 base64 格式图像时出错