PDA

Volledige versie bekijken : rekening houden met vertraging in een class


maartenlierop
%Europe/Berlin %999 %2006, 23:59
Hoi!

Ik ben druk in de weer om een beetje bekend te raken met as3.
Ik ben vrij onbekend met het werken met classes, dus wellicht is mijn probleem niet zo heel moeilijk, maar ik ben al de hele middag en avond bezig geweest, zonder succes helaas.

Het probleem is dat ik een class heb gemaakt waar je een adres van een rssfeed heen stuurt.
Mij bedoeling is dat er dan een string terugkomt met bewerkte inhoud van de feed.

Een feed is alleen niet direct op te halen, dat duurt even, net als de bewerking van de feed.
Onderstaand script geeft dus altijd 'null' als resultaat.

feed = reader1.read(rssurl);
trace (feed);


nu kan ik natuurlijk doormiddel van een timer pas na een paar seconden controleren of er een uitkomst is, maar het zou mooier zijn als de class zelf zou laten wten wanneer hij klaar is.

Dit zou dan, denk ik, met een evenlistener moeten, en heb hier ook het één en ander mee geprobeert. Helaas werkt niets.

kan iemand me een hint geven met welke listener ik dit aan zou kunnen pakken?

Dauntless
%Europe/Berlin %006 %2006, 00:09
Hoe lees je de rss in? Hoogst waarschijnlijk moet je gewoon met events leren werken.
Bv (In AS 2.0): Bij het laden van een xml moet je wachten tot de onLoad uitgevoerd is, want vanaf dán is je data beschikbaar:
var myXML:XML = new XML();
myXML.ignoreWhite = true;
myXML.onLoad = function()
{
trace(this);//data is beschikbaar
}
myXML.load("data.xml");
trace(myXML);//undefined, data is nog niet beschikbaar

maartenlierop
%Europe/Berlin %012 %2006, 00:18
dank voor je snelle reactie!
ik maak in de class gebruik van twee eigenlijk twee functies.
de eerste haalt de xml binnen, en als deze binnen is dan bouw ik het om naar een xml formaat dat ikzelf kan gebruiken.

mij class (om het maar even minder vaag te maken) ziet er zo uit


package {
import flash.net.*;
import flash.events.*;
public var feed:Array = new Array();

//class FeedReader{
public class FeedReader {
private var RssUrl:String; // plaats waar feed moet worden gehaald
private var tempfeed:Array = new Array();
private var RssRegion:String; // voor welk werelddeel staat de feed
public var raad:String;
private var zin:String;
// Constructor
public function read(RssUrl){
//trace ("dit is de url die is ontvangen"+RssUrl);
var loader1:URLLoader = new URLLoader();
loader1.addEventListener( Event.COMPLETE, handleComplete);
loader1.load ( new URLRequest (RssUrl));
}

public function set RssConvertor(RssUrl){
var loader1:URLLoader = new URLLoader();
loader1.addEventListener( Event.COMPLETE, handleComplete);
loader1.load ( new URLRequest (RssUrl));
}

public function get RssConvertor(){
return feed;
}

public function verzenden() {
//trace ("Dit werkt eindelijke!!!");
//trace (feed);
return feed;
}

public function handleComplete( event:Event ){
var loader1:URLLoader = URLLoader( event.target );

// ****
var myXML1:XML = new XML(loader1.data);
var i=0;
for each (var num:XML in myXML1..item) {
// bewerken van data
// Uit discription eerst alle html tags aan het einde verwijderen
TempTekst = num.description;
plaats1 = TempTekst.indexOf("<",0);
// Daarna alle spaties en returns die nog na de laatste punt komen
TempTekst = TempTekst.slice(0,plaats1);
plaats3 = TempTekst.lastIndexOf(".", TempTekst.length);
plaats3 +=1;
TempTekst = TempTekst.slice(0,plaats3);

var temptitle:String = num.title;
var tempdate:String = num.pubDate;
var tempurl:String = num.link;
//trace (i);
// item node maken en toevoegen aan de feed node
var TempItem:String = "<item><title>"+temptitle+"</title><text>"+TempTekst+"</text><date>"+tempdate+"</date><url>"+tempurl+"</url></item>";
feed[i] = TempItem;
//trace (i+"*****"+TempItem);
i++;
}
trace ("xml maken is klaar");
}
}
}


en ik haal nu als volgt de info er uit op


var reader1:FeedReader = new FeedReader();
reader1.RssConvertor = feed1url;
timer1.addEventListener(TimerEvent.TIMER, onTimer1);
function onTimer1(event:TimerEvent):void {
trace ("NUUUU");
feed1 = reader1.RssConvertor;
trace ("en dit de uitkomst"+feed1);
}
timer1.start();


het probleem van vertraging is binnen de class dus geen probleem, maar mijn hoofdscript wacht gewoon niet totdat er iets terugkomt.

Dauntless
%Europe/Berlin %044 %2006, 01:04
loader1.addEventListener( Event.COMPLETE, handleComplete);
Hier vang je dus je COMPLETE event op. Vanaf dat moment kan je dus je data gebruiken (en dat weet je blijkbaar dus wel). Maar nu moet je zelf ook en event dispatchen naar je hoofdscript zodat die weet dat de xml klaar is met laden. Dat kan je hoogstwaarschijnlijk met de EventDispatcher class doen:
http://livedocs.macromedia.com/flex/2/langref/flash/events/EventDispatcher.html

maartenlierop
%Europe/Berlin %009 %2006, 00:13
Hoi!

Het zal wel aan mij lliggen, maar na een paar avonden site's afstruinen op zoek naar een duidelijke uitleg over events kom ik er toch echt niet uit.

ten eerste; mijn aanpak zou zijn dat ik een listener maak die kijkt of de 'eindvariabele' in de FeedReader class al een inhoud heeft gekregen. Want zolang deze class nog niet klaar is, zal deze variabele leeg zijn.

Ik moet dus een listener maken die de variabele in de gaten houdt. moet ik dan de 'OnData' gebruiken? Lijkt logisch, maar in de actionscript reference staat dat deze eigenlijk voor ander soort data bedoelt is.

Maar misschien denk ik wel helemaal verkeerd.

Daarnaast vroeg ik mij af; ik kan ook aan het einde van de FeedReader class gewoon een functie aanroepen die in de "root" staat; dus in het eigenlijke flash bestand. Functies aanroepen tussen verschillende classes lukt me wel, maar aangezien je geen class mag aanmakan in een flash bestand, kan je hier ook niet naar linken. klopt het dat dit niet kan, of is daar een trucje voor?