我在与整个使用requirejs不同的模块在循环中调用函数的问题。 循环内的函数调用驻留在模块A,并且执行将触发关闭使用jQuery Ajax请求模块B的功能。 环路打完具有不同参数的不同请求的每次迭代被传递到模块B的功能将触发关闭Ajax请求。 当Ajax请求的成功函数执行,我发现我的所有参数值总是最后Ajax调用所做的价值观,所有4所独立的Ajax调用。
我做了一些谷歌上搜索这听起来像一个循环中执行功能时,这是一个很常见的问题。 此修复程序往往是打出来的函数调用成不同的功能,创建一个不同的范围。 由于我的循环和Ajax调用有两种不同的模块,我本以为这样可以解决这个问题,但它仍然存在。
我试着在其他堆栈溢出的职位一些解决方案,如: JSLint的错误“不要在循环中做出的功能。” 导致问题有关JavaScript本身和如何参数传递到setTimeout调用定义一个匿名函数? 没有成功。 任何人有任何想法?
对于回路模块示例代码:
define(["mpos"],
function(mpos){
var monitor = {
startMonitoring : function(poolObj){
// Start Monitoring
$.each(mpos.msgs, function(action,callback){
poolObj.action = action;
mpos.sendApiRequest(poolObj,action,callback);
});
}
};
return monitor;
}
);
为Ajax模块B的示例代码 - 该模块如在模块A MPOS引用
define(["mule","constants"],
function(mule,constants){
var mpos = {
sendMessage : function(postData,callback,$poolOut){
return $.ajax({
'type':'post',
'url':constants.URLS.proxy,
'data':{'url':postData},
success : function(data){
// if we have $poolOut we know this is a mpos call
if($poolOut != undefined){
var keys = Object.keys(data);
// add poolOut to data
data.poolOut = $poolOut;
var poolObj = $poolOut.data('poolObj');
if(poolObj){
var action = poolObj.action;
console.log(poolObj,action);
if(action){
if(action == "getuserstatus"){
mule.registerPool(poolObj);
}
} else {
log.error("No action on poolObj while attempting to calculate the need for a registerPool call");
}
}
}
// parse data
callback.apply(this, data);
},
error : function(x,h,r){ ... },
dataType : 'json'
});
},
sendApiRequest : function(poolObj,action,callback){
var url = poolObj.url + '&page=api&action=' + action;
var $poolOut = constants.cache.monitorOutput.find('.pool-out.' + poolObj.id);
var dfd = mpos.sendMessage(url,callback,$poolOut);
$.when(dfd).always(function(){
var refreshTimer = setTimeout(function(){
if(constants.state.monitorEnabled){
mpos.sendApiRequest(poolObj, action, callback);
}
}, poolObj.refreshRate);
});
},
msgs : {
"getuserstatus" : function(data){ ... },
"getpoolstatus" : function(data){ ... },
"getuserworkers" : function(data){ ... },
"getuserbalance" : function(data){ ... }
}
};
return mpos;
}
);
谢谢!