Глобальный массив Javascript не определен, когда в функции OnSuccess PageMethod? - PullRequest
0 голосов
/ 28 июля 2011

У меня есть несколько пользовательских элементов управления, загружающихся асинхронно на моей странице с использованием методов страницы.Некоторые выпадающие списки вызывают асинхронные обратные вызовы этих пользовательских элементов управления, а пользовательские элементы управления перезагружаются с измененным содержимым.У нас были свои причины сделать это таким образом.

Однако в настоящее время нашим пользователям приходится ждать загрузки этих пользовательских элементов управления, прежде чем они смогут изменить свой выбор в выпадающих списках.В попытке улучшить взаимодействие с пользователем я пытаюсь прервать предыдущие, еще не загруженные запросы.

Я пытаюсь поддерживать глобальный массив 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
    }
}

1 Ответ

0 голосов
/ 30 июля 2011

Массивы передаются по ссылке в js.Это дает мне преимущество, позволяя мне видеть массив в том состоянии, в котором он находился, когда я нажимал на функцию OnSuccess, а не в том состоянии, в котором он находился при вызове метода страницы.По крайней мере, я думаю, именно поэтому это работает.Мне нужна была ссылка на массив, переданный в функцию 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
    }
}
...