更新变量后执行函数

时间:2013-09-11 15:11:47

标签: javascript

我正在编写模块化JavaScript,我有一个完成大量处理的功能,即。绘制2幅画布,更新大量变量并存储对象引用。现在我想执行另一个使用上面更新的变量的函数。

这样的事情:

  • 绘画画布 - 将图像尺寸存储在变量(以及许多其他内容)中
  • 使用这些尺寸做一些数学和几何,再次更新画布!我不能在第一个函数中做这个数学,因为它是我用来绘制画布的常用实用函数,在我的代码中无处不在。

如果我在代码中注入setTimeout 10秒钟,一切正常,但没有它,上面的第二条指令找不到更新的变量,因此失败。

有什么方法可以解决这个问题吗?意思是,我想在设置了一些必需的变量后才执行第二条指令。我说同步执行。

注意:我不能在这里(或任何地方)发布任何代码,因为我的工作场所不允许这样做!

2 个答案:

答案 0 :(得分:2)

对于这样的情况,我建议使用jQuery and custom events。只需在第一个函数更新完画布后发布一个事件。第二个函数(以及其他任何函数)可以监听这些事件并做任何他们想做的事情。

临:

  • 无耦合
  • 个别部件易于测试
  • 可扩展

缺点:

  • 需要jQuery,否则您需要提取事件处理代码。

答案 1 :(得分:1)

您可以使用getter和setter来监视给定条件 在setter中,您可以进行一些计算,检查是否满足某些条件  并在必要时进行更新。

只是为了给你一个想法:

 // updateFunc is the function called whenever a property changes
 // and all conditions are met for an update.
 // newProp1,2,3 are the new values for prop1,2,3
 function MyStorageClass(updateFunc, newProp1, newProp2, newProp3 ) {
    this.updateFunc = updateFunc;
    this.prop1 = newProp1 ;
    this.prop2 = newProp2 ;
    this.prop3 = newProp3 ;
 }

 var MSCProto = MyStorageClass.prototype;

 // update is needed if all properties are >0
 MSCProto.checkUpdateRequired = function() {
   return ( ( this.prop1 > 0 ) && (this.prop2 > 0) && (this.prop3 > 0) )
 }

 Object.defineProperty(MSCProto, 'prop1', {  
        get : function() { retrurn this._prop1},
        set : function(x) { this._prop1 = x;  
                            // and some other computations if need be
                            if (this.checkUpdateRequired()) this.updateFunc(); } };

 Object.defineProperty(MSCProto, 'prop2', {  
        get : function() { retrurn this._prop2},
        set : function(x) { this._prop2 = x;  
                            // and some other computations if need be
                            if (this.checkUpdateRequired()) this.updateFunc(); } };      

 Object.defineProperty(MSCProto, 'prop3', {  
        get : function() { retrurn this._prop3},
        set : function(x) { this._prop3 = x;  
                            // and some other computations if need be
                            if (this.checkUpdateRequired()) this.updateFunc(); } };