变量更新的Javascript回调

时间:2014-03-25 16:28:20

标签: javascript html5 audio

我目前正在使用HTML5和Javascript开发游戏。现在,我正在添加声音,并且还想要开启/关闭经典音乐'并且打开/关闭声音'纽扣。我不想跟踪我的所有Audio对象,每次设置其中一个按钮时都会循环播放它们,所以我宣布了两个全局布尔,音乐和声音,两者都默认为真正。如果它们是真的,它们各自的音频对象会播放,而当它们错误时,它们就不会播放。

使用简单的if语句,这对于创建对象很容易。但是,如果我想在创建后更改对象的状态,如果用户更改了任一设置,则会给您带来不便。我希望能够对布尔值进行回调,有效地说:(伪代码)

var music = true;

class Music() {
    this.audio = new Audio(fileName);

    music.onUpdate(function() {
        if(music) {
            this.audio.play();
        } else {
            this.audio.pause();
        }
    }

    if(music) {
        this.audio.play();
    }
}

此外,如果我可以级联这些更好,那么几个回调可以注册到同一个变量。我理解这不是需要定期完成的事情,但是在我完全重写项目的这一部分之前,是否有一个简单的语言功能可以用来实现它?

由于

1 个答案:

答案 0 :(得分:0)

您可以将变量包装在实现简单事件处理机制的对象中,这是一个示例:

var variable = {
  _value: true,
  set: function(value) {
    if (value !== this._value) {
      this._value = value;
      for (var i = 0; i < this._callbacks.length; i++) {
        this._callbacks[i](value);
      }
    }
  },
  get: function() { return this._value; },

  _callbacks: [],
  onChange: function(callback) {
    this._callbacks.push(callback);
  },
  offChange: function(callback) {
    // Find the callback and remove it from the _callbacks array.
    // If !callback, this._callbacks = [];
  }
}

// Usage:
variable.onChange(function(value) { console.log(value); });

variable.set(false); // 'false' logged to the console
variable.set(false); // nothing is logged to the console

您可以使用onChange方法添加多个侦听器。当值更改时,将调用所有这些函数。您可以使用offChange方法删除事件侦听器。我添加它是为了完整。

您可以使用支持Observable Objects的库来开箱即用。如果您环顾四周,可以使用许多功能,但也包含许多您可能不需要的功能。