在Javascript中传递空回调是不好的做法吗?

时间:2017-06-16 21:57:06

标签: javascript memory-leaks callback event-loop

我有一个长时间运行的功能,我真的不关心正确处理。将它与空回调一起交给事件循环并继续前进是不好的做法。像这样:

var takeSomeTime = function(callback) {

  var count = 0,
      max = 1000,
      interval;

  interval = setInterval(function() {
    count++;
    if (count === max) {
      interval.clearInterval();
      return callback();
    }
  }, 1000);
};

var go = function(callback) {

  // do some stuff
  takeSomeTime(function(err) {
      if (err) {
          console.error(err)
      }
      // take all the time you need
      // I'm moving on to to do other things.
  });

  return callback();

};

go(function(){ 
  // all done... 
});

1 个答案:

答案 0 :(得分:1)

我不知道你的问题是如何与内存泄漏有关的,但人们当然可以想到通常传递空函数的有用应用程序。你基本上可以将一个空函数传递给第三方代码,它需要一个函数并且不检查它是否真的有一个。就像您的示例或这个小型日志库一样:

// Javascript enum pattern, snatched from TypeScript
var LogLevel;
(function (LogLevel) {
    LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
    LogLevel[LogLevel["WARN"] = 1] = "WARN";
    LogLevel[LogLevel["ERROR"] = 2] = "ERROR";
    LogLevel[LogLevel["FATAL"] = 3] = "FATAL";
})(LogLevel || (LogLevel = {}));
// end enum pattern

var noLog = function() {}; // The empty callback

function getLogger(level) {
    var result = {
        debug: noLog,
        warn: noLog,
        error: noLog
    };

    switch(level) {
        case LogLevel.DEBUG:
            result.debug = console.debug.bind(console);
        case LogLevel.WARN:
            result.warn = console.warn.bind(console);
        case LogLevel.ERROR:
            result.error = console.error.bind(console);
    }
    return result;
}

var log1 = LogFactory.getLogger(LogLevel.DEBUG);
var log2 = LogFactory.getLogger(LogLevel.ERROR);

log1.debug('debug test');// calls console.debug and actually displays the
    // the correct place in the code from where it was called.

log2.debug('debug test');// calls noLog
log2.error('error test');// calls console.error

您基本上将空函数noLog返回给我们库的使用者,以便禁用特定日志级别的日志记录,但是可以使用任意数量的参数调用它而不会引发错误。