Объем функции обратного вызова Javascript? - PullRequest
0 голосов
/ 03 апреля 2011

У меня есть функция javascript, у которой есть обратный вызов, затем анонимная функция, затем другой обратный вызов, и что-то не так с областью действия.Параметр callbackFunc сохраняет свое значение из первого вызова функции и не использует новое значение, переданное во втором вызове функции.

function IsReady(callbackFunc) {   
    if (!IsValid()) return false;
    IsConnected(function () {
        if (typeof (callbackFunc) == 'function')
            callbackFunc();
        return true;
    });    
}

function IsConnected(validCallbackFunc) {
$.post("IsConnected", function (data) {
    if (data.IsValid) {
        if (validCallbackFunc && typeof (validCallbackFunc) == 'function')
            validCallbackFunc();
    }
});
}

$('#SaveButton').click(function () {
    IsReady(SaveInvoice); // works       
});

$('#ExportButton').click(function () {
    // works only if IsConnected() is true     
    // otherwise SaveInvoice is called again
    IsReady(ExportInvoice);  
});

function SaveInvoice() {}
function ExportInvoice() {}

В некоторых случаях, когда я нажимаю кнопку ExportButton, вместо функции ExportInvoice запускается функция SaveInvoice.Я предполагаю, что это ограниченная проблема - что каким-то образом старое значение callbackFunc было сохранено.Но я не совсем понимаю это из-за смеси обратного вызова + анонимной функции + другого обратного вызова.Я не писал этот код, но я должен это исправить.Могу ли я что-нибудь сделать, чтобы очистить значение callbackFunc в конце IsReady ()?

IsReady (ExportInvoice) работает, если IsConnected () имеет значение true.Если IsConnected () имеет значение false, то результат заключается в том, что SaveInvoice () выполняется, когда на самом деле ничего не должно происходить (потому что он не подключен).

1 Ответ

1 голос
/ 03 апреля 2011

Невозможно сохранить значение callbackFunc между двумя различными вызовами функции IsReady.

В вашем коде каждый раз, когда выполняется обработчик события щелчка, создается новая область при вызове IsReady. Каждая область имеет свой локальный параметр callbackFunc. Каждая область будет определять свою собственную анонимную функцию, переданную в IsConnected, где находится переменная callbackFunc, заключенная в замыкание.

Так что это не проблема объема.

Чтобы доказать это, я эмулировал ваш код здесь: http://jsfiddle.net/pwJC7/

В вашем коде вы говорите о возвращаемом значении IsConnected. Эта функция на самом деле ничего не возвращает. Кажется, что состояние соединения проверяется посредством вызова ajax, возвращающего данные XML или JSON со свойством IsValid (эмулируется $_post в скрипте).

Возможно, ваша проблема связана с этим асинхронным вызовом. Но невозможно, чтобы вы вызывали функцию SaveInvoice в результате нажатия кнопки ExportInvoice с предоставленным вами кодом JavaScript.

...