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

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


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

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

(迷宫从initFunctionA开始,以initFunctionA结束)

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

更改回调(在呼叫站点),以便捕获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); } }; 

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

我会使用一个对象构造函数:

 function ClassOne() { this.array2 = []; } ClassOne.prototype.initFunctionA = function() { // ... } ClassOne.prototype.functionD = function(data, array) { // Can use array2 EX: this.array2 } var classOne = new ClassOne(); 

这就是我理解你的问题的方法: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。

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

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

这三个被认为是唯一的方法。

在不使用全局变量的情况下从其他函数访问变量

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

使用jQuery …

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

 

并且在等待的function中:

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

基本上包含您需要在不可见的DOM对象上的jQuery绑定自定义事件中执行的最后操作。 使用jQuery的triggerHandler从JS触发该事件。 通过你的参数和瞧!

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

所以:p Stack Overflow(jk你已经多次保存我的屁股了,我爱你们:)