Function.createCallback неправильно передает контекст в FireFox - PullRequest
1 голос
/ 09 июня 2009

Я обнаружил, что кажется ошибкой в ​​том, как библиотека MS AJAX взаимодействует с FireFox - но, возможно, я просто делаю это неправильно. У меня есть скрипт, который выглядит примерно так:

    dowork({ value: "some value", currentRetry: 0 });

    // Try to connect at least 10 times, with a second in-between retries..
    function dowork(request) {
        if (request.currentRetry < 10) {
            logMessage('currentRetry = ' + request.currentRetry + '; trying again in 1 second.');
            request.currentRetry++;
            var callback = Function.createCallback(dowork, { value: request.context, currentRetry: request.currentRetry });
            setTimeout(callback, 1000);
        }
        else {
            logMessage('Exceeded retries; currentRetry = ' + request.currentRetry);
        }
    }

Другими словами, я пытаюсь сделать что-то, что может периодически давать сбой, поэтому я хочу повторить попытку, скажем, 10 раз, со вторым промежуточным интервалом. Единственный способ выяснить, как это сделать, это использовать что-то вроде бита Function.createCallback из библиотеки MS Ajax.

И это работает правильно, скажем, в IE 8 и Chrome 2, то есть выдает следующий вывод:

currentRetry = 0; повторить попытку через 1 секунду.
currentRetry = 1; повторить попытку через 1 секунду.
currentRetry = 2; повторить попытку через 1 секунду.
currentRetry = 3; повторить попытку через 1 секунду.
currentRetry = 4; повторить попытку через 1 секунду.
currentRetry = 5; повторить попытку через 1 секунду.
currentRetry = 6; повторить попытку через 1 секунду.
currentRetry = 7; повторить попытку через 1 секунду.
currentRetry = 8; повторить попытку через 1 секунду.
currentRetry = 9; повторить попытку через 1 секунду.
Превышены повторные попытки; currentRetry = 10

Однако в FireFox (3.5 Preview, не тестировал его в других версиях) вывод выглядит так:

currentRetry = 0; повторить попытку через 1 секунду. Превышены повторные попытки; currentRetry = не определено

Есть какие-нибудь мысли или об обходном пути, или о том, что я делаю неправильно?

1 Ответ

1 голос
/ 09 июня 2009

Ну, я не знаю, в чем проблема с Function.createCallback, но я смог исправить это с помощью анонимного метода:

var callback = function () { dowork(request) }; 
setTimeout(callback, 1000);

Достаточно близко для работы правительства.

...