代码之家  ›  专栏  ›  技术社区  ›  Kyle Cureau

如何获取跨多个函数返回的变量-Javascript/jQuery

  •  2
  • Kyle Cureau  · 技术社区  · 14 年前

    总之,这个问题是要弄清楚如何在javascript函数之间传递变量,而不必返回变量、在主函数之间传递参数、使用全局变量以及强制函数1等待函数2完成。我找到了一个jQuery解决方案并在下面(答案部分)发布了。


    全局变量不会强制初始函数等待。倒回去四次也不管用。如果不能返回修改后的变量,如何将其传递回初始化函数?或者它为什么不回来?

    (迷宫始于 initFunctionA ,结束于 functionD

    classOne = {
      initFunctionA : function() {
        classTwo.functionB(functionD, array);
        // I NEED ACCESS TO ARRAY2 HERE
      },
      functionD : function(data, array) {
        var array2 = // modifications to array
      }
    }
    
    {...}
    
    classTwo = {
      functionB : function(callback, array) {
        $.ajax({
          success: function(ret){
            classTwo.functionC(ret, callback, array)
          }
        });
      },
      functionC : function(ret, callback, array) {
         callback(ret.data.x, array);
      }
    }
    
    5 回复  |  直到 14 年前
        1
  •  1
  •   strager    14 年前

    更改回调(在调用站点),以便捕获 functionD . 然后,改变 这样它就回来了 array2 . 我加了一句 this 为了方便起见,请访问下面的示例。(另外,如果您想让JSLint满意,请确保在“required”处包含分号。)

    classOne = {
      initFunctionA : function() {
        var self = this;
    
        classTwo.functionB(function() {
            var array2 = functionD.apply(self, arguments);
    
            // ACCESS ARRAY2 HERE
        }, array);
      },
      functionD : function(data, array) {
        var array2 = // modifications to array
    
        return array2;
      }
    };
    
    {...}
    
    classTwo = {
      functionB : function(callback, array) {
        $.ajax({
          success: function(ret){
            classTwo.functionC(ret, callback, array)
          }
        });
      },
      functionC : function(ret, callback, array) {
         callback(ret.data.x, array);
      }
    };
    
        2
  •  1
  •   Pointy    14 年前

    你不能让它与你在那里写的模式一起工作;在Javascript中根本不可能,因为没有“等待”这样的东西。您的ajax代码必须接受回调参数(您已经得到了回调参数,但不清楚它来自何处或是做什么的),并且在ajax调用完成后,初始函数应该传入代码,以便对数组执行所需的操作。

        3
  •  1
  •   ChaosPandion    14 年前

    function ClassOne() {
        this.array2 = [];
    }
    
    ClassOne.prototype.initFunctionA = function() {
        // ...
    }
    
    ClassOne.prototype.functionD = function(data, array) {
        // Can use array2 EX: this.array2
    }
    
    var classOne = new ClassOne();
    
        4
  •  0
  •   Matt    14 年前

    我就是这样理解你的问题的: classTwo处理AJAX调用并可能修改结果。classOne使用classTwo获取一些数据,并需要得到结果数据。

    如果是,这是怎么回事:

    classOne = {
      initFunctionA : function() {
        var array = ['a','b','c'];
        classTwo.functionB(this.functionD, array);
      },
      functionD : function(data, array) {
        // This function is called when the AJAX returns.
        var array2 = // modifications to array
      }
    }
    
    {...}
    
    classTwo = {
      functionB : function(callback, array) {
        $.ajax({
          success: function(ret){
            classTwo.functionC(ret, callback, array)
          }
        });
      },
      functionC : function(ret, callback, array) {
         callback(ret.data.x, array);
      }
    }
    

    所以呢classOne.initFunctionA类电话二级功能B它设置了一个ajax调用。当ajax调用成功完成时,类别2.c使用结果和初始数组调用。从这里开始,一级功能被称为返回数据.x和数组。

        5
  •  0
  •   Community CDub    8 年前

    可以!我找到了一种在函数之间传递变量的方法,而不需要:

    • 生成对象属性(混沌解)

    这三种方法在这里被认为是唯一的方法。

    Accessing variables from other functions without using global variables

    但是,如果不能直接传递参数,并且需要一个函数等待另一个函数(即,不能依赖引用),并且在中间函数中使用对服务器的异步调用,则唯一的解决方案是:

    正在使用jQuery。。。

    在DOM中创建此对象(如果不想弄脏标记,则动态创建):

    <div id='#domJSHandler" style="display: none;"></div>
    

    //Function & Class Set 2
    $('#domJSHandler').bind('proceedWithAction', function(event, param1, param2) {
        // action set 2
    });
    

    在等待的函数中:

    //Function & Class Set 1
    // action set 1
    $('#domJSHandler').triggerHandler('proceedWithAction', [param1, param2]);
    

    基本上,将需要在不可见DOM对象上的jQuery绑定自定义事件中执行的最后一个操作封装起来。使用jQuery的triggerHandler从JS触发该事件。传递你的参数,瞧!

    So:p堆栈溢出