在这段代码中,为什么要使用闭包?

时间:2015-06-30 12:33:24

标签: node.js sockets tcp

我不明白为什么在下面的代码中使用了闭包:

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不是布尔值吗?

2 个答案:

答案 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之前将调用该函数。