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

时间:2010-08-20 13:09:15

标签: javascript jquery function class return-value

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


Old Post:我初始化了一组四个函数,每个函数以不同的方式相互调用。最后,我需要将最终修改的产品(数组)返回到初始化函数。

全局变量不会强制初始函数等待。并且向后返回四次也不起作用。如果无法返回,如何将修改后的变量传递回其初始化函数?或者为什么不回来?

(迷宫从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 个答案:

答案 0 :(得分:1)

你无法使用像你在那里写过的模式一样工作;在Javascript中根本不可能,因为没有“等待”这样的东西。你的ajax代码必须采用一个回调参数(你已经得到了,虽然它不清楚它来自何处或它做了什么),并且初始函数应传入代码以在ajax调用之后执行数组所需的操作饰面。

答案 1 :(得分:1)

我会使用对象构造函数:

function ClassOne() {
    this.array2 = [];
}

ClassOne.prototype.initFunctionA = function() {
    // ...
}

ClassOne.prototype.functionD = function(data, array) {
    // Can use array2 EX: this.array2
}

var classOne = new ClassOne();

答案 2 :(得分:1)

更改回调(在通话网站上),以便捕获functionD的返回值。然后,更改functionD,使其返回array2。为方便起见,我已添加this访问以下示例。 (另外,如果你想让JSLint满意的话,一定要包含“必需”的分号。)

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);
  }
};

答案 3 :(得分:0)

这就是我理解你的问题的方法: 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调用classTwo.functionB来设置ajax调用。当ajax调用成功完成时,将使用结果和初始数组调用classTwo.functionC。从这里开始,使用ret.data.x和数组调用classOne.functionD。

答案 4 :(得分:0)

好!我发现了一种在函数之间传递变量的方法,而不是:

  • 制作全局变量
  • 制作对象属性(Chaos的解决方案)
  • 传递参​​数

这里提出这三个是唯一的方法。

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触发该事件。通过你的参数和瞧!

我敢肯定,这会给我废话(并且自恋地接受我自己的答案),但我认为这对于一个超级新手来说非常棒,而且对我有用。

所以:p Stack Overflow (jk你们都多次救了我的屁股,我爱你们所有人:)