0

我有一个close可以关闭某些实例的功能。包含该函数的类允许派生类覆盖close。在这里,我想确保即使在派生类中也close总是调用。dispose我通过以下方式实现了这一点。

function close() {
  closeCore();
  dispose();
}

function closeCore() {
  // derived class can override this method.
}

这很好用,但我有一种情况,我想在处置实例之前执行 CSS 动画。这就是我所做的。

function close () {
  instance.classList.add("fancy-animation-that-takes-800ms");

  setTimeout(function () {
    dispose();
  },800);
}

但是一旦我这样做了,我使用的模板模式就无法应用了。有没有办法确保 close 函数在第二个示例中始终调用 dispose ?

4

1 回答 1

0

您可能close期望从closeCore其中返回具有以下参数的对象:

return {timeout: 800, callback: function () {/*....will execute after a timeout..*/}};

或者:

return {callback: function () { /*...will be immediately executed...*/}};

或者:

return function () { /*...will be immediately executed...*/};

...然后为他们调用他们的超时时间(如果有的话),然后在你的超时时间执行他们的回调之后,然后调用dispose他们。

您的代码的相关部分close可能如下所示:

function close() {
  var ccObj = closeCore();
  var ccIsObj = ccObj && typeof ccObj === 'object';
  var callback = typeof ccObj === 'function' ? ccObj : (ccIsObj ? ccObj.callback : null);
  if (ccIsObj && ccObj.timeout) {
    if (!callback) {
      throw 'You must implement a callback when supplying a timeout';
    }
    setTimeout(function () {
        callback();
        dispose();
    }, ccObj.timeout);
  }
  else {
    if (callback) {callback();}
    dispose();
  }
}

但是,如果您想允许用户进行他们自己的任意异步调用(例如 Ajax),而您可以改为允许返回您添加dispose调用的 Promise,您将无法保证派生程序会确保完成承诺。您可以在一段时间后自动取消承诺,但除非您再次抽象出来,否则您无法神奇地知道派生代码何时完成。

于 2014-02-08T23:26:30.133 回答