我不明白为什么在下面的代码中使用了闭包:
function writeData(socket, data){
var success = !socket.write(data);
if(!success){
(function(socket, data){
socket.once('drain', function(){
writeData(socket, data);
});
})(socket, data)
}
}
以及为什么使用var success=!socket.write(data);
而不是直接输入。
可能socket.write
不是布尔值吗?
答案 0 :(得分:2)
IIFE是不必要的,您可以将代码重写为:
function writeData(socket, data){
var success = ! socket.write(data);
if (! success) {
socket.once('drain', function() {
writeData(socket, data);
});
}
}
甚至这个:
function writeData(socket, data){
var success = ! socket.write(data);
if (! success) {
socket.once('drain', writeData.bind(this, socket, data));
}
}
答案 1 :(得分:0)
根据socket.write()
的{{1}},方法
在套接字上发送数据。第二个参数指定编码 在字符串的情况下 - 它默认为UTF8编码。
如果将整个数据成功刷新到内核,则返回true 缓冲。如果全部或部分数据在用户中排队,则返回false 记忆。当缓冲区再次释放时,将发出'drain'。
数据时将执行可选的回调参数 最终写出来 - 这可能不是立即的。
在代码中,如果第一个socket.write()无法一次性刷新所有数据,则闭包等待套接字排出事件,在这种情况下,它将再次调用writeData方法。这是创建异步递归函数的一种非常巧妙的方法,在成功返回true
之前将调用该函数。