Вспышка «сценария в этом фильме» - вызвана loadVars или setInterval? - PullRequest
1 голос
/ 25 октября 2010

Это что-то странное ...

У меня есть Flash-файл, который загружает внешние SWF-файлы. Там я использую LoadVars для получения внешних данных с сервера. Когда данные поступили, я использую setInterval для вызова функции, которая добавляет содержимое.

Пока все хорошо.

Но когда я переключаю меню (иначе выгрузим один фильм, чтобы загрузить другой) до того, как все данные поступят, Flash зависает примерно на 15 секунд, а затем показывает мне печально известное сообщение «Сценарий в этом фильме замедляет Flash - не могли бы вы? нравится прерывать его? »(грубо переведено).

Я прикрепил функцию «onUnload» к SWF, которая вызывает серьезные проблемы, где я использую clearInterval, чтобы избавиться от интервала и повторно создать экземпляр переменной LoadVars.

Ничего не помогает ...

Есть идеи?

согласно запросу - вот источник SWF, вызывающий проблему:

var myTimer = null;
var server_send:LoadVars = new LoadVars();

this.onUnload = function () {
    clearInterval(myTimer);
    server_send = new LoadVars();
    trace("stopping gewerbe");
};

var myself = scrollContent;

import JSON;    // external Class for parsing JSON

var sRes:LoadVars = new LoadVars();

function fadeIn(which){
    which._alpha += 3;

    if(which._alpha >= 100){
        clearInterval(myTimer);
    }
}

sRes.onLoad = function(success:Boolean){

    if (success){

        var o:Object = JSON.parse(sRes.res);
        var s:String = JSON.stringify(o); 

        //trace(sRes.res);

        var y = 0;

        for(item in o){

            actCol = 0;

            myself.attachMovie("row", "entry" + item, myself.getNextHighestDepth(), {_x: 0, _y:y});

            var tr = myself["entry" + item];

            tr.cTitle = o[item]["title"];
            tr.cBild = o[item]["image"];
            tr.cText = o[item]["text"];
            y += 65;

        }

        myTimer = setInterval(fadeIn, 0.1, myself);

        _root.myIntervals.push(myTimer);

    }
    else
    {
        trace("no connection...");
    }

}

myself._alpha = 0;

var vars = Array("id");
var values = Array("3");

server_send.load('void.txt');

for(var i=0;i<vars.length;i++)
{
    server_send[vars[i]] = escape(values[i]);
}

server_send.sendAndLoad(_global.server, sRes, "POST");

stop();

Ответы [ 2 ]

0 голосов
/ 25 октября 2010

Спасибо за помощь - похоже, я нашел причуду ...

Ответ sendAndLoad все еще вызывался, даже когда фильм был выгружен, что вызывает цикл, кажется.

Что я сделал:

добавил переменную в верхней части скрипта под названием «doParse» и установил для нее значение true

var doParse = true;

Затем в функции unload я установил эту переменнуюв false:

this.onUnload = function () {
doParse = false;
...
}

и в случае, когда при поступлении данных вызывается, я добавил следующее:

if(success && doParse == true){
...
}

Это помогло, и сообщение исчезло.

0 голосов
/ 25 октября 2010

Обновление

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

Возможно, проблема setInterval внутри функции sRes.onLoad.Интервал должен быть в миллисекундах, поэтому ваш 0.1 должен быть равен 100 (в течение 1/10 секунды), а вызовы clearInterval в fadeIn и unLoad могут иметь myInterval вне области, проверьте их с помощью trace, чтобы убедиться, что они очищаются, как и ожидалось.

Код

Хорошо, я переупорядочил код, чтобы сделать его немного более читабельным ... Однако, он все еще вочень плохая форма.Я отмечаю вещи, которые мне нужно обсудить с вами далее ... (см. Ниже дополнительные комментарии в коде.)

stop();

// Moved import to the top.
import JSON;

// Grouping var declarations.
var myself = scrollContent;
myself._alpha = 0;

var values = Array("3");
var myTimer = null;
var sRes:LoadVars = new LoadVars();
var server_send:LoadVars = new LoadVars();
var vars = Array("id");    

// why are we looping through an array of one value?
for(var i=0; i<vars.length; i++)
{
    server_send[vars[i]] = escape(values[i]);
}

server_send.load('void.txt'); // what is this for?

server_send.sendAndLoad(_global.server, sRes, "POST"); // where do we define _global.server

this.onUnload = function () {
    clearInterval(myTimer); // is myTimer in scope here?
    server_send = new LoadVars();
    trace("stopping gewerbe");
};    

function fadeIn(which){
    which._alpha += 3;
    if(which._alpha >= 100){
        clearInterval(myTimer); // is myTimer in scope here?
    }
}

sRes.onLoad = function(success:Boolean)
{
    if (success)
    {
        var o:Object = JSON.parse(sRes.res);
        var s:String = JSON.stringify(o); 
        var y = 0;

        for(item in o)
        {
            actCol = 0;
            myself.attachMovie("row", "entry" + item, myself.getNextHighestDepth(), {_x: 0, _y:y});
            var tr = myself["entry" + item];
            tr.cTitle = o[item]["title"];
            tr.cBild = o[item]["image"];
            tr.cText = o[item]["text"];
            y += 65;
        }

        myTimer = setInterval(fadeIn, 0.1, myself); // setInterval uses milliseconds 0.1 is almost certainly the problem. 
                                                    // if you want 1/10th of a second, specify 100 as the interval.
        _root.myIntervals.push(myTimer); // We never see _root.myIntervals again, what's this for? 
                                         // The fadeIn and unLoad methods could use this to 
                                         // guarantee that they clear the right interval.
    }
    else
    {
        trace("no connection...");
    }
}
...