我有多个用户控件在我的页面上异步加载,使用pagemethods。一些dropdownlists导致这些用户控件的异步回调,和用户控制与修改的内容重新载入。我们有理由这样做。
但是,目前我们的用户必须等待这些用户控件加载它们可以在dropdownlists改变自己的选择之前。在试图提供更好的用户体验,我尝试中止以前,尚未将待加载的请求。
我试图保持未完成的异步请求执行器的全局JS阵列,以确保只有为每个用户控制的最新请求被加载。换句话说,我想取消先前对尚未加载的特定用户控件的请求,并优先考虑该用户控件的最新请求。
我遇到的问题是,当我的OnSuccess函数执行时,全局数组是未定义的。
我是以错误的方式解决这个问题吗?什么是我不知道的?
非常感谢任何帮助。
这是我的代码的一个简化示例:
var outstanding_requests;
$.fn.remove_or_item = function (val, col) {
var arr1 = $(this);
var arr2 = new Array();
$.each(arr1, function (k, v) {
if (v[col] != val) { arr2.push(v); }
else if (v[1].get_started()) { v[1].abort(); }
});
return arr2;
}
$.fn.find_or_item = function (val, col) {
var item;
var arr1 = $(this);
$.each(arr1, function (k, v) {
if (v[col] == val) { item = v; return false; } return true;
});
return item;
}
function RunMyPageMethod(panelname) {
var request; //current request object
if (outstanding_requests == undefined) { outstanding_requests = new Array(); }
outstanding_requests = $(outstanding_requests).remove_or_item(panelname, 0);
request = PageMethods._staticInstance.LoadUserControl(panelname, PageMethodSuccess, PageMethodFailure);
outstanding_requests.push([panelname, request.get_executor()]);
}
function PageMethodSuccess(result, userContext, methodName) {
var panelname = result.split("|")[0];
//here outstanding_requests is undefined
if($(outstanding_requests).find_or_item(panelname,0))
{
outstanding_requests = $(outstanding_requests).remove_or_item(panelname, 0);
//load usercontrol
}
}
答案 0 :(得分:0)
数组在js中通过引用传递。这样可以让我看到数组在我点击OnSuccess函数时的状态,而不是我调用pagemethod时的状态。至少我认为这就是它起作用的原因。我需要对传入OnSuccess函数的数组的引用。我最后用上面显示的最后两个函数做了这个,这很好用..
function RunMyPageMethod(panelname) {
var request; //current request object
if (outstanding_requests == undefined) { outstanding_requests = new Array(); }
outstanding_requests = $(outstanding_requests).remove_or_item(panelname, 0);
request = PageMethods._staticInstance.LoadUserControl(panelname,function(result,userContext,methodName){ PageMethodSuccess(result,userContext,methodName,outstanding_requests); }, PageMethodFailure);
outstanding_requests.push([panelname, request.get_executor()]);
}
function PageMethodSuccess(result, userContext, methodName, outstanding_requests) {
var panelname = result.split("|")[0];
if($(outstanding_requests).find_or_item(panelname,0))
{
outstanding_requests = $(outstanding_requests).remove_or_item(panelname, 0);
//load usercontrol
}
}