Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-反应性_Javascript - Fatal编程技术网

JavaScript-反应性

JavaScript-反应性,javascript,Javascript,我有这个密码。它总是这样做,当会话中存在对某个键感兴趣的函数时,每当该键更改其值时,就会调用该函数。 问题是,为了跟踪函数感兴趣的键,我需要运行该函数一次,它可能会产生一些副作用(例如,如果该函数将操作DOM)。如果可能的话,如何在不影响当前环境的情况下运行该功能 var checkRunning = false; var keys = []; var checks = {}; var Session = { get: function (key) { if (checkRunni

我有这个密码。它总是这样做,当会话中存在对某个键感兴趣的函数时,每当该键更改其值时,就会调用该函数。 问题是,为了跟踪函数感兴趣的键,我需要运行该函数一次,它可能会产生一些副作用(例如,如果该函数将操作DOM)。如果可能的话,如何在不影响当前环境的情况下运行该功能

var checkRunning = false;
var keys = [];
var checks = {};

var Session = {
  get: function (key) {
    if (checkRunning) {
      keys.push(key);
    }
  },
  set: function (key, value) {
    if (checks[key]) {
      var l = checks[key].lenght;
      for (var i = 0; i < l; i++) {
        checks[key][i]();
      }
    }
  }
};

function check(f) {
  checkRunning = true;
  f();
  checkRunning = false;
  var l = keys.lenght;
  for (var i = 0; i < l; i++) {
    if (checks[keys[i]]) {
      checks[keys[i]].push(f);      
    }
    else {
      checks[keys[i]] = [f];
    }
  }
  keys = [];
}

//how to use

var a = "something";

check(function () {
  // this function should be run always when Session key "a_dep" will change
  a = Session.get("a_dep");
});

Session.set("a_dep", 10); 
Session.set("a_dep", 20); 
var checkRunning=false;
var键=[];
var检查={};
var会话={
获取:函数(键){
如果(检查运行){
按键。按(键);
}
},
设置:功能(键、值){
如果(选中[键]){
var l=检查[键]。长度;
对于(变量i=0;i
所以我重构了您的代码,以实现我理解的您想要的

我首先重新定义了会话及其getter/setter。我将值存储在文本对象中,并使用键访问它:

function Session () {
    this.myDictionnary = {};
    this.myCallbacks = {};
}
Session.prototype.set = function (key, value) {
    this.myDictionnary[key] = value;
}
Session.prototype.get = function (key) {
    return this.myDictionnary[key];
}
这里有我们的核心代码。现在,您希望在每次为键设置值时调用函数,因此我们必须

  • 设置功能(或功能集)-键对
  • 当值设置为key时调用此函数(或这些函数)
  • 注意
    myCallbacks
    literal对象,它将处理这些对。首先,创建键-函数耦合:

    Session.prototype.callbackWhenSet = function (key, callback) {
        if(!this.myCallbacks[key]) {
            this.myCallbacks[key] = [];
        }
        this.myCallbacks[key].push(callback);
    }
    
    然后在调用set时调用它(这里我重写了
    set
    函数)

    如您所见,每次设置“a_dep”时,我们都会显示一个警报。

    或者您可以使用并执行以下操作:

    var obj = ProAct.prob({
      a: 4
    });
    obj.p('a').on(function () {
      console.log('obj.a has changed!');
    });
    

    如果我是你,我会处理这个物体。看看这个@TolgahanAlbayrak:仅在Gecko中实现……您可以在这里找到对象监视垫片:
    var test = new Session();
    
    test.callbackWhenSet("a_dep", function () {
        alert("a_dep is set to " + test.get("a_dep"));
    });
    
    test.set("a_dep", 10);
    test.set("something", 250);
    test.set("a_dep", 20);
    
    var obj = ProAct.prob({
      a: 4
    });
    obj.p('a').on(function () {
      console.log('obj.a has changed!');
    });