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);
});
}
我有一个关于回调函数的问题。考虑这个简单的代码:
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);
});
}