Avatar billede Slettet bruger
11. januar 2009 - 14:07 Der er 7 kommentarer og
1 løsning

Hønen og ægget - ns er ikke defineret (AS3)

Hej eksperter.

Jeg er ved at lave en stream-videoafspiller, men har problemer med en kommando, der sætter min volumen. Det kan sikkert laves på 117 andre måder, men det irriterer mig ikke at den melder fejl på noget så simpelt.

Denne funktion styrer volumen:
function setVolume(intVolume:Number = 0):void {
    trace("Volume sat");
    var sndTransform            = new SoundTransform(intVolume);
    ns.soundTransform        = sndTransform; <--- DENNE LINIE GIVER COMPILERFEJL
    osv...
}

Problematikken er, at ns ikke erklæres lige med det samme - for det afhænger af, hvorvidt der kunne opnåes forbindelse vha. NetConnection (den forbinder til en rtmp-tjeneste).

Først når en XML-fil er indlæst samt når forbindelsen er oprettet, erklæres ns:

// *************** HER OPRETTES FORBINDELSEN ***************
function connectStream():void {
  if (!ns) {
    trace("ns eksisterer ikke. Opret denne");
    // Opret sammenkædningen 1 gang
    var ns:NetStream = new NetStream(nc);
    ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
    ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
    ns.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
    var custom_obj:Object = new Object();
    ...osv
}

Jeg har også prøvet if(Boolean(ns)) og try/catch - men hvorfor giver den vedholdende compilerfejl: 1120: Access of undefined property ns?
Avatar billede Slettet bruger
11. januar 2009 - 15:03 #1
Der skulle selvfølgelig ha' stået at det irriterer mig grænseløst :)
Avatar billede welcor Nybegynder
11. januar 2009 - 15:22 #2
Så vidt jeg kan se, har du to muligheder.

1. gem en referense til din SoundTransform(), og vent med at sætte den på ns indtil ns findes, eller

2. Ignorer kald til setVolume, hvis der ikke er en ns. Sæt en default SoundTransform() på ns under creation.
Avatar billede Slettet bruger
11. januar 2009 - 19:53 #3
Hej Welcor - og tak for dit svar.

Mulighed nr. 1 overvejede jeg også. Det er hermed gjort og alt virker OK.
Mulighed nr. 2 er (hvis jeg har forstået dig korrekt) også det jeg har gjort med if(Boolean(ns)) og min try/catch.
Men jeg var primært ude efter at høre, hvad årsagen er til at det ikke virker. Hvis jeg f.eks. skriver:
if (Boolean(ns)) {
  var sndTransform = new SoundTransform(intVolume);
  //ns.SoundTransform = sndTransform;
}
så melder den compilerfejl i både if-sætningen... og eftersom jeg checker på, hvorvidt ns overhovedet er sat, fatter jeg ikke hvorfor den giver compilerfejl
Avatar billede welcor Nybegynder
11. januar 2009 - 21:05 #4
Svaret er egentlig forholdsvis enkelt.

Når du skriver:

if (!ns) {
    trace("ns eksisterer ikke. Opret denne");
    // Opret sammenkædningen 1 gang
    var ns:NetStream = new NetStream(nc);

Findes der simpelthen ingen ns endnu, i if-sætningen.

Du bliver nød til at deklarere din variabel udenfor if-sætningen, i "toppen" af klassen, så den kan ses af alle functions:


var ns:NetStream = null;

....


function connectStream():void {
  if (ns == null) {
    trace("ns eksisterer ikke. Opret denne");
    // Opret sammenkædningen 1 gang
    ns = new NetStream(nc);
    ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler);
    ns.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
    ns.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
    var custom_obj:Object = new Object();
    ...osv
}

Jeg er lidt rusten i lige præcis ActionScript, men den fejl tyder på scope-problemer.
Avatar billede Slettet bruger
11. januar 2009 - 21:31 #5
Jeg forstår det stadig ikke helt...
Selv om der skulle være tale om et scope-problem, burde der vel ikke ske andet end at if-sætningen bliver rapporteret som "false", hvis ns ikke er undefined?
Avatar billede welcor Nybegynder
11. januar 2009 - 22:37 #6
Det er ActionsScripts måde at "hjælpe dig" på - Pludselig dukker der en referense til en ukendt variabel, ns, op. Er det en stavefejl?

Husk at ActionScript (i setVolume) ikke kan vide at du lokalt i din connectStream() function deklarerer en variabel med det navn - og at det er den du mener...

Alle moderne programmeringssprog tillader også shadowing:

public class test {

public function test() {
  var a:Animation = new Animation();
}

public function test2() {
  a = new Animation();
}
}

Her vil du få samme fejl i test2().
Avatar billede Slettet bruger
11. januar 2009 - 22:57 #7
Nå nej, det er da klart :) Tak for det. Svar = point.
Avatar billede welcor Nybegynder
11. januar 2009 - 23:04 #8
Bare lige for at sige det - det er ikke shadowing, jeg demonstrerer i det sidste eksempel :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester