Проверка стека Javascript в Safari Mobile (iPad) - PullRequest
2 голосов
/ 19 марта 2011

У меня есть код, который выглядит так:

function myEventHandler() {
    inMyEventHandler = true;
    longRunningStuff();
    inMyEventHandler = false;
}

Это прекрасно работает, за исключением iPad, где Safari Mobile время от времени прерывает мой Javascript с ошибкой. Поэтому longRunningStuff () умирает и inMyEventHandler никогда не очищается. Это очень плохо, потому что inMyEventHander абсолютно не может быть установлен , если мы находимся за пределами этой функции, или происходят плохие вещи (tm).

В идеале я мог бы просто проверить изнутри longRunningStuff, находится ли myEventHandler над ним в стеке вызовов, и это позаботилось бы само о себе. Я не могу найти способ сделать это ... Подсказки?

Ответы [ 3 ]

2 голосов
/ 27 июня 2012
  1. (Простейший) Вы можете проверить arguments.callee.caller в longRunningStuff:

    function longRunningStuff() {
      if (arguments.callee.caller === myEventHandler) {
        // take care
      }
    }
    
  2. Другой вариант:

    function myEventHandler() {
      // code
    }
    myEventHandler.disable_in_longRunningStuff = true;
    function longRunningStuff() {
      if (arguments.callee.caller.disable_in_longRunningStuff) {
        // take care
      }
    }
    
  3. Самый длинный способ - извлечь стек вызовов из https://github.com/eriwen/javascript-stacktrace

1 голос
/ 19 марта 2011

Я годами использовал следующий метод для проверки стека вызовов вручную.Я не обновлял его некоторое время и никогда не пробовал на ipad или мобильном сафари, поэтому я не могу сказать, сработает ли он для вас или нет.

Может быть, вы можете использовать его для вдохновения:

function logStackTrace(levels) {
    var c = console;
    var callstack = [];
    var isCallstackPopulated = false;
    try {
        throw new Error();
    } catch (e) {
        if (e.stack) { //Firefox
            var lines = e.stack.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
                    callstack.push(lines[i]);
                }
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
        else if (window.opera && e.message) { //Opera
            var lines = e.message.split('\n');
            for (var i = 0, len = lines.length; i < len; i++) {
                if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
                    var entry = lines[i];
                    //Append next line also since it has the file info
                    if (lines[i + 1]) {
                        entry += " at " + lines[i + 1];
                        i++;
                    }
                    callstack.push(entry);
                }
            }
            //Remove call to logStackTrace()
            callstack.shift();
            isCallstackPopulated = true;
        }
    }
    if (!isCallstackPopulated) { //IE and Safari
        var currentFunction = arguments.callee.caller;
        while (currentFunction) {
            var fn = currentFunction.toString();
            var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
            callstack.push(fname);
            currentFunction = currentFunction.caller;
        }
    }
    if (levels) {
        c.log(callstack.slice(0, levels).join('\n'));
    }
    else {
        c.log(callstack.join('\n'));
    }
};
0 голосов
/ 06 октября 2012

Начиная с iOS 6 доступен настоящий веб-инспектор.Смотрите ниже или эту ссылку.https://stackoverflow.com/a/12762449/72428

Обновление !!! В OS X вы можете использовать веб-инспектор Safari на устройствах iOS Simulator и iOS 6.

  1. Сначала включитеМеню разработчика в Safari.
  2. Далее включите удаленную отладку на устройстве iOS (или в симуляторе).

    Settings > Safari > Advanced > Web Inspector (ON)
    
  3. Вернитесь в Safari на своем устройстве.
  4. Вернитесь к компьютеру, откройте меню «Разработчик» и выберите свое устройство (например, iPhone Simulator, iPhone)

Примечание. Устройство будет отображаться ТОЛЬКО в меню «Разработчик» только в Safari.активен и работает.

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...