总结这个问题是要弄清楚如何在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);
}
}
答案 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)
好!我发现了一种在函数之间传递变量的方法,而不是:
这里提出这三个是唯一的方法。
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你们都多次救了我的屁股,我爱你们所有人:)